Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>JavaFX</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/JavaFX"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-JavaFX rootpage-JavaFX skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">JavaFX</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><table class="float-right infobox toccolours toptextcells" style="border-spacing:5px; font-size:90%; text-align:left; width:21em;">

<tbody><tr>
<th colspan="2" class="hintergrundfarbe6" style="font-size:105%; text-align:center;">JavaFX
<p class="mw-empty-elt">
</p>
</th></tr>
<tr>
<td colspan="2" class="notheme" style="text-align:center; background-color:#f8f9fa;"><span typeof="mw:File"></span>
</td></tr>
<tr>
<th colspan="2" class="hintergrundfarbe5" style="font-size:105%; text-align:center;">Basisdaten
<p class="mw-empty-elt">
</p>
</th></tr>
<tr>
<td><b><a href="Softwareentwickler" title="Softwareentwickler">Entwickler</a></b>
</td>
<td><a href="Oracle" title="Oracle">Oracle</a>
</td></tr>
<tr>
<td><b>Aktuelle&nbsp;<a href="Version_(Software)" title="Version (Software)">Version</a></b>
</td>
<td><span class="wikidata-content">21.0.6<sup id="cite_ref-_4a1e7bf7ce4315c6_1-0" class="reference"><a href="#cite_note-_4a1e7bf7ce4315c6-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></span> <br> (<span class="wikidata-content">21. Januar 2025</span>)
</td></tr>
<tr>
<td><b><a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a></b>
</td>
<td><a href="Windows" class="mw-redirect" title="Windows">Windows</a>, <a href="MacOS" title="MacOS">macOS</a>, <a href="Linux" title="Linux">Linux</a>
</td></tr>
<tr>
<td><b><a href="Programmiersprache" title="Programmiersprache">Programmier­sprache</a></b>
</td>
<td><span class="wikidata-content"><a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a>, JavaFX Script</span>
</td></tr>
<tr>
<td><b>Kategorie</b>
</td>
<td><a href="Framework" title="Framework">Framework</a>
</td></tr>
<tr>
<td><b>Lizenz</b>
</td>
<td><a href="GPL" class="mw-redirect" title="GPL">GPL</a> mit <a href="GPL_linking_exception" title="GPL linking exception">GPL linking exception</a>
</td></tr>
<tr>
<td><b><a href="Lokalisierung_(Softwareentwicklung)" title="Lokalisierung (Softwareentwicklung)">deutschsprachig</a></b>
</td>
<td>nein
</td></tr>
<tr>
<td class="hintergrundfarbe5" colspan="2" style="text-align:center;"><a rel="nofollow" class="external text" href="https://wiki.openjdk.java.net/display/OpenJFX/Main">OpenJFX auf java.net</a> und <a rel="nofollow" class="external text" href="https://openjfx.io/">openjfx.io</a>
</td></tr></tbody></table>
<p><b>JavaFX</b> ist ein <a href="Framework" title="Framework">Framework</a> zur Erstellung <a href="Plattform%C3%BCbergreifend" class="mw-redirect" title="Plattformübergreifend">plattformübergreifender</a> <a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a>-<a href="Anwendungssoftware" title="Anwendungssoftware">Applikationen</a>. Es ist eine <a href="Java-Technologie" title="Java-Technologie">Java-Spezifikation</a> von <a href="Oracle" title="Oracle">Oracle</a> und setzt sich zum Ziel, das professionelle Erstellen und Verteilen von <a href="Interaktivit%C3%A4t" title="Interaktivität">interaktiven</a>, <a href="Multimedia" title="Multimedia">multimedialen</a> Inhalten und <a href="Grafische_Benutzeroberfl%C3%A4che" title="Grafische Benutzeroberfläche">grafischen Benutzeroberflächen</a> (GUIs) über sämtliche <a href="Java-Plattform" class="mw-redirect" title="Java-Plattform">Java-Plattformen</a> hinweg zu erleichtern.
</p><p>Bis 2014 waren <a href="Abstract_Window_Toolkit" title="Abstract Window Toolkit">AWT</a> und <a href="Swing_(Java)" title="Swing (Java)">Swing</a> die Standardlösungen für grafische Anwendungen unter Java. Allerdings waren diese in die Jahre gekommen. So gab es Lücken im Bereich Medien und <a href="Animation" title="Animation">Animation</a>, was jedoch bei modernen grafischen Oberflächen heutzutage gefragt ist. Anstatt in die Weiterentwicklung von AWT/Swing zu investieren, entschied sich Oracle mit JavaFX für eine komplette Neuentwicklung der GUI-Ebene.
</p><p>JavaFX setzt insbesondere auf einen <a href="Szenengraph" title="Szenengraph">Szenengraphen</a> (engl. <i>scene graph</i>), der die einzelnen Bestandteile einer GUI verwaltet. Es ermöglicht mit FXML auch eine <a href="Deklarative_Programmierung" title="Deklarative Programmierung">deklarative</a> Beschreibung von grafischen Oberflächen auf <a href="XML" class="mw-redirect" title="XML">XML</a>-Basis. Mit dem Scene Builder existiert ein grafisches Tool, das die Erstellung von FXML-Dateien vereinfacht. Darüber hinaus können für die Gestaltung auch <a href="World_Wide_Web" title="World Wide Web">Web</a>-Technologien wie <a href="Cascading_Style_Sheets" title="Cascading Style Sheets">CSS</a> eingesetzt werden, indem sie in den FXML-Code eingebettet werden.
</p><p>Da JavaFX alle <a href="Programmierschnittstelle" title="Programmierschnittstelle">APIs</a> für moderne Oberflächen anbietet und auch nicht von AWT/Swing abhängig ist, bildet es einen kompletten Media-Stack. JavaFX greift direkt auf alle 2D-/3D-Fertigkeiten moderner <a href="Grafikprozessor" title="Grafikprozessor">Grafikprozessoren</a> zurück. So kann mit JavaFX auch all das programmiert werden, was bisher vorzugsweise mit <a href="Adobe_Flash" title="Adobe Flash">Flash</a> realisiert wurde.<sup id="cite_ref-Inselbuch1011_2-0" class="reference"><a href="#cite_note-Inselbuch1011-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>Die <i>JavaFX-Laufzeitumgebung</i> war von Version <a href="Java-Laufzeitumgebung" title="Java-Laufzeitumgebung">Java&nbsp;SE Runtime&nbsp;7 Update&nbsp;6</a><sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> bis 10<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> Teil jeder x86 Java SE Installation.
</p>

<div class="mw-heading mw-heading2"><h2 id="Entwicklungsgeschichte">Entwicklungsgeschichte</h2></div>
<p>Die Geschichte von JavaFX ist nicht besonders geradlinig. Ursprünglich wollte <a href="Sun_Microsystems" title="Sun Microsystems">Sun</a> / <a href="Oracle" title="Oracle">Oracle</a> JavaFX als <a href="Adobe_Flash" title="Adobe Flash">Flash</a>-Ersatz im Internet positionieren, jedoch war die Kombination aus <a href="HTML5" title="HTML5">HTML5</a> und <a href="Cascading_Style_Sheets" title="Cascading Style Sheets">CSS3</a> und <a href="JavaScript" title="JavaScript">JavaScript</a> zu attraktiv. Heutzutage ist es vor allem ein <a href="GUI-Toolkit" title="GUI-Toolkit">GUI-Toolkit</a> für klassische <a href="Client-Anwendung" class="mw-redirect" title="Client-Anwendung">Client-Anwendungen</a>.<sup id="cite_ref-Inselbuch1011_2-1" class="reference"><a href="#cite_note-Inselbuch1011-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Version_1">Version 1</h3></div>
<p>JavaFX wurde im Mai 2007 angekündigt und im Mai des folgenden Jahres auf der Entwicklerkonferenz <a href="JavaOne" title="JavaOne">JavaOne</a> vorgestellt. Am 4. Dezember 2008 gab Sun JavaFX 1.0 offiziell als Entwickler-Kit für <a href="Windows" class="mw-redirect" title="Windows">Windows</a> und <a href="MacOS" title="MacOS">macOS</a> frei.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> Das Release JavaFX 1.0 erschien zusammen mit der Programmiersprache <i>JavaFX Script</i>. Diese Sprache machte es einfach möglich, hierarchische Objektgraphen aufzubauen und bot eine gute <a href="Syntax" title="Syntax">Syntax</a> für Object-Binding, womit Zustände synchronisiert werden konnten.<sup id="cite_ref-Inselbuch1011_2-2" class="reference"><a href="#cite_note-Inselbuch1011-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>Die Version 1.2 wurde im Juni 2009 veröffentlicht. Sie enthielt unter anderem anpassbare UI-Controls, zusätzliche Layout-Klassen (Tile, Stack, Flow, ClipView, Panel), Unterstützung für RSS/Atom-Feeds. Sie ist nicht abwärtskompatibel. Erst seit dieser Version wurden <a href="Linux" title="Linux">Linux</a> und <a href="Solaris_(Betriebssystem)" title="Solaris (Betriebssystem)">Solaris</a> unterstützt. Die Version 1.3 (Codename SoMa) wurde am 22.&nbsp;April 2010 veröffentlicht. Die offensichtlichste Neuerung ist eine teils enorme Steigerung der Performance. Neu ist zudem JavaFX TV, eine offizielle CSS-API zur Gestaltung von JavaFX-Controls, einige neue, gewünschte Controls sowie eine Unterstützung von 3D.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> Die Version 1.3.1 wurde am 21. August 2010 veröffentlicht und verbesserte die Fortschrittsanzeige beim Aufstarten und das Debugging in <a href="Netbeans" class="mw-redirect" title="Netbeans">Netbeans</a> 6.9.1.
</p>
<div class="mw-heading mw-heading3"><h3 id="Version_2">Version 2</h3></div>
<p>JavaFX 2.0 erschien wie angekündigt im dritten Quartal 2011.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> In dieser Version wird auf JavaFX Script verzichtet, „denn Oracle wollte keine weitere Programmiersprache aufbauen, sondern eine pure Java-API, die Entwickler dann von unterschiedlichen existierenden Skriptsprachen ansprechen konnten.“<sup id="cite_ref-Inselbuch1011_2-3" class="reference"><a href="#cite_note-Inselbuch1011-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> Deshalb wurden die bestehenden JavaFX Script APIs auf Java portiert. In JavaFX 2.0 wurde außerdem das Hardware-Rendering optimiert, sodass nun Spiele und aufwendige 3D-Darstellungen möglich sein sollen. HTML- und JavaScript-Inhalte rendert JavaFX 2.0 mit Hilfe der <a href="WebKit" title="WebKit">WebKit</a>-Bibliothek. Oracle hat im Zuge der Veröffentlichung der neuen Version angekündigt, JavaFX zukünftig als Open-Source-Projekt im Rahmen des <a href="OpenJDK" title="OpenJDK">OpenJDK</a> weiterzuentwickeln.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup>
</p><p>JavaFX entwickelte sich nun immer mehr zur Alternative von Swing/AWT. Im August 2012 erschien JavaFX 2.2. Dieses wurde in das <a href="Java-Laufzeitumgebung" title="Java-Laufzeitumgebung">JRE</a>/<a href="Java_Development_Kit" title="Java Development Kit">JDK</a> 7 Update 6 integriert. Der Schritt war ungewöhnlich, denn so große Ergänzungen waren bisher als Update im JRE/JDK noch nie gemacht worden.<sup id="cite_ref-Inselbuch1012_9-0" class="reference"><a href="#cite_note-Inselbuch1012-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p><p>Die Entwicklung in Richtung <a href="Open_Source" title="Open Source">Open Source</a> mündete in OpenJFX, wodurch sich zusammen mit dem <a href="OpenJDK" title="OpenJDK">OpenJDK</a> ein komplett freies Java-System mit GUI-Stack unter der <a href="GNU_General_Public_License" title="GNU General Public License">GPL</a> bauen lässt.<sup id="cite_ref-Inselbuch1012_9-1" class="reference"><a href="#cite_note-Inselbuch1012-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Version_8">Version 8</h3></div>
<p>Mit dem Einzug in den Java-8-Release machte dann auch JavaFX den Release-Sprung von 2 auf nun 8. JavaFX 8 bringt einige Neuerungen mit. So bietet es beispielsweise <a href="Lambda-Funktion" class="mw-disambig" title="Lambda-Funktion">Lambdas</a> als neues Sprachkonstrukt an. Eine der großen Neuerungen ist auch das JavaFX-UI-Toolkit, das mit Java 8 als empfohlenes UI-Toolkit ausgeliefert wird. Das Toolkit bietet mit FXML u.&nbsp;a. eine <a href="Extensible_Markup_Language" title="Extensible Markup Language">XML</a>-basierte Sprache zum Erstellen von Benutzerschnittstellen an.<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>
</p><p>Mit der Version 8u33 wurde der <a href="ARM-Architektur" title="ARM-Architektur">ARM</a>-Support von Oracle für JavaFX eingestellt. Daher ist JavaFX nicht mehr in den offiziellen Java Distributionen für ARM enthalten.<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Roadmap">Roadmap</h3></div>
<p>Oracle plant, die Entwicklung weiterhin zu leiten und mit interessierten Dritten zusammenzuarbeiten.<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Architektur">Architektur</h2></div>
<p>Die Architektur von JavaFX ist von Grund auf neu und beruht insbesondere nicht auf Swing beziehungsweise AWT. Das bedeutet allerdings auch, dass man JavaFX und AWT/Swing nicht ohne Weiteres mischen kann (auch wenn es dafür Lösungen gibt). JavaFX bietet ein komplettes API für moderne Oberflächen an. Die wichtigsten <a href="Paket_(UML)" title="Paket (UML)">Pakete</a> dieser API sind:<sup id="cite_ref-Steyer166f_13-0" class="reference"><a href="#cite_note-Steyer166f-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>
</p>
<table class="wikitable">

<tbody><tr>
<th>Package</th>
<th>Beschreibung
</th></tr>
<tr>
<td>javafx.animation</td>
<td>Klassen für <a href="Animation" title="Animation">Animationen</a> auf Basis von Übergängen
</td></tr>
<tr>
<td>javafx.application</td>
<td>Die Klassen für den grundsätzlichen Lebenszyklus einer Applikation
</td></tr>
<tr>
<td>javafx.collections</td>
<td>Essentielle JavaFX-Collections samt Utilities
</td></tr>
<tr>
<td>javafx.event</td>
<td>Das Basis-Framework für JavaFX-Events und deren Behandlung
</td></tr>
<tr>
<td>javafx.fxml</td>
<td>Klassen zum Laden einer Objekthierarchie aus einer Markup-Struktur wie FXML
</td></tr>
<tr>
<td>javafx.geometry</td>
<td>Klassen für geometrische Operationen auf zweidimensionalen Objekten
</td></tr>
<tr>
<td>javafx.scene</td>
<td>Die Basisklassen für das JavaFX Scene Graph API und das Elternpaket der einzelnen Komponenten und Elemente. Es enthält Unterpakete wie canvas, chart, control, effect, image, input, layout, media, paint, shape, text, transform, web usw.
</td></tr>
<tr>
<td>javafx.stage</td>
<td>Top-Level-Container-Klassen für JavaFX-Inhalte
</td></tr>
<tr>
<td>javafx.util</td>
<td>Verschiedene Utilities und Hilfsklassen
</td></tr></tbody></table>
<p>Die folgende Grafik zeigt die Architektur von JavaFX, wie sie von Oracle offiziell dargestellt wird<sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup>:
</p><p><span typeof="mw:File"></span>
</p><p>Wie bei jeder Java-Applikation befindet sich auch bei JavaFX auf der untersten Ebene die <a href="Java_Virtual_Machine" title="Java Virtual Machine">Java Virtual Machine</a> (JVM), die für die Ausführung des Java-<a href="Bytecode" title="Bytecode">Bytecodes</a> verantwortlich ist. Hierbei wird im Normalfall jedes gestartete Java-Programm in seiner eigenen <a href="Virtuelle_Maschine" title="Virtuelle Maschine">virtuellen Maschine</a> (VM) ausgeführt.
</p><p>Die entsprechenden <a href="Software_Development_Kit" title="Software Development Kit">Entwicklungstools</a> für Java respektive JavaFX werden im <a href="JDK" class="mw-redirect" title="JDK">Java SE Development Kit</a> (oder nur Java Development Kit, kurz JDK) bereitgestellt. Darauf aufbauend existieren zahlreiche Erweiterungen, die man teils schon sehr lange bei Java nutzen kann, wie beispielsweise <a href="Java_2D" title="Java 2D">Java 2D</a> zum Zeichnen von zweidimensionalen Formen.
</p><p>Bei Prism<sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">[</span>Anmerkung 1<span class="cite-bracket">]</span></a></sup> handelt es sich um die neue <a href="Grafik-Engine" title="Grafik-Engine">Rendering Engine</a>, die Gebrauch von der Grafikhardware macht (falls unterstützt). Unter anderem werden damit auch Eigenschaften von Java 2D und diverse grafische Effekte wie Schatten, Spiegelungen, Transformationen oder Animationen auf einer hohen Ebene verfügbar gemacht.<sup id="cite_ref-Steyer8f_16-0" class="reference"><a href="#cite_note-Steyer8f-16"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup> Dabei wird unter <a href="Linux" title="Linux">Linux</a> und <a href="MacOS" title="MacOS">macOS</a> mit <a href="OpenGL" title="OpenGL">OpenGL</a> gerendert, während unter <a href="Microsoft_Windows" title="Microsoft Windows">Windows</a> <a href="Direct3D" title="Direct3D">Direct3D</a> zum Einsatz kommt. Wird die Grafikhardware nicht unterstützt, wird ein Software-<a href="R%C3%BCckfallebene" title="Rückfallebene">Fallback</a> auf Java 2D verwendet.<sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup>
</p><p>Das <i>Glass Windowing Toolkit</i> stellt Low-Level-Betriebssystemroutinen zur Verfügung, wie Fensterverwaltung, Timer oder Ereignisverwaltung. Es dient als plattformabhängige Schicht, die die JavaFX-Plattform mit dem Betriebssystem verbindet.<sup id="cite_ref-Steyer8f_16-1" class="reference"><a href="#cite_note-Steyer8f-16"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup>
</p><p>Die <i>Media Engine</i> basiert auf <a href="GStreamer" title="GStreamer">GStreamer</a> und bietet umfangreiche Unterstützung für Audio und Video an. Die <i>Web Engine</i> ermöglicht die Einbettung von <a href="World_Wide_Web" title="World Wide Web">Web-Inhalten</a> in JavaFX-Applikationen. Dazu gehört das <a href="HTML-Renderer" class="mw-redirect" title="HTML-Renderer">HTML-Rendering</a> auf Basis der <a href="WebKit" title="WebKit">WebKit</a>-Engine, das hardwareabhängige Rendern über Prism und die Möglichkeit des <a href="Document_Object_Model" title="Document Object Model">DOM-Zugriffs</a> und der Manipulation des DOM.<sup id="cite_ref-Steyer8f_16-2" class="reference"><a href="#cite_note-Steyer8f-16"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup>
</p><p>Das <i>Quantum Toolkit</i> verknüpft Prism, Glass Windowing Toolkit, Media Engine und Web Engine und macht diese einheitlich den JavaFX-APIs zugänglich. Das JavaFX-API und das Quantum Toolkit kapseln die Details der tieferliegenden Ebenen und verbergen diese vor dem Anwender. Ein JavaFX-Entwickler braucht also im Prinzip gar nicht zu wissen, wie die tieferliegenden Ebenen funktionieren.<sup id="cite_ref-Steyer8f_16-3" class="reference"><a href="#cite_note-Steyer8f-16"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Aufbau_einer_JavaFX-Anwendung">Aufbau einer JavaFX-Anwendung</h2></div>
<div class="mw-heading mw-heading3"><h3 id="JavaFX-Lebenszyklus">JavaFX-Lebenszyklus</h3></div>

<p>JavaFX-Anwendungen erweitern die <a href="Basisklasse" title="Basisklasse">Basisklasse</a> <code>Application</code>, die Lebenszyklus-<a href="Methode_(Programmierung)" title="Methode (Programmierung)">Methoden</a> wie <code>init()</code>, <code>start()</code> oder <code>stop()</code> <a href="Vererbung_(Programmierung)" title="Vererbung (Programmierung)">vererbt</a>. Diese Methoden können (oder müssen) in der JavaFX-Anwendung <a href="%C3%9Cberschreiben_(Programmierung)" title="Überschreiben (Programmierung)">überschrieben</a> werden. Der JavaFX-Launcher kümmert sich darum, dass diese entsprechend aufgerufen werden. JavaFX-Anwendungen benötigen also keine <code>main</code>-Methode: Die eigene statische <code>main(String[])</code>-Methode leitet an die statische <code>launch(String[])</code>-Methode der <code>Application</code>-<a href="Klasse_(Objektorientierung)" title="Klasse (Objektorientierung)">Klasse</a> weiter und übergibt ihr alle <a href="Kommandozeilenparameter" title="Kommandozeilenparameter">Aufrufparameter</a>.<sup id="cite_ref-18" class="reference"><a href="#cite_note-18"><span class="cite-bracket">[</span>Anmerkung 2<span class="cite-bracket">]</span></a></sup> Da die Klassenmethode <code>launch(...)</code> weiß, in welcher Klasse sie aufgerufen wurde, erzeugt sie ein Exemplar dieser Klasse und ruft dann die Lebenszyklusmethoden auf.<sup id="cite_ref-Ullenboom1032_19-0" class="reference"><a href="#cite_note-Ullenboom1032-19"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup>
</p><p>Der Lebenszyklus einer JavaFX-Anwendung sieht folgendermaßen aus:<sup id="cite_ref-20" class="reference"><a href="#cite_note-20"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Epple9f_21-0" class="reference"><a href="#cite_note-Epple9f-21"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup>
</p>
<ol><li>Beim Start der Anwendung konstruiert die JavaFX-<a href="Runtime" class="mw-redirect" title="Runtime">Runtime</a> zunächst eine <a href="Objekt_(Programmierung)#Instanziierung" title="Objekt (Programmierung)">Instanz</a> der <code>Application</code>-Klasse.</li>
<li>Nun wird die <code>init()</code>-Methode der erzeugten Instanz ausgeführt. Diese Methode wird als <i>default</i> leer implementiert und muss nicht zwingend überschrieben werden. Es können hier beispielsweise die Aufrufparameter ausgelesen werden. Es dürfen hier jedoch noch keine UI-Elemente erzeugt werden.<sup id="cite_ref-22" class="reference"><a href="#cite_note-22"><span class="cite-bracket">[</span>Anmerkung 3<span class="cite-bracket">]</span></a></sup></li>
<li>Als Nächstes wird die Methode <code>start(javafx.stage.Stage)</code> aufgerufen, die von jeder JavaFX-Anwendung überschrieben werden muss. JavaFX übergibt der Methode eine Stage (deutsch „Bühne“), was etwa der Aufgabe eines Haupt-Containers entspricht und am ehesten mit dem Startfenster verglichen werden kann.</li>
<li>Die JavaFX-Runtime wartet nun, bis die Anwendung beendet wird. Dies ist folgendermaßen möglich:
<ul><li>durch Aufruf der Methode <code>Platform.exit()</code></li>
<li>indem das letzte Fenster geschlossen wird und das Attribut <code>implicitExit</code> auf Platform auf <code>true</code> gesetzt ist.</li></ul></li>
<li>Nun ruft die Runtime die <code>stop()</code>-Methode auf, bevor der Java-<a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozess</a> gestoppt wird. Diese Methode muss wiederum nicht zwingend überschrieben werden.</li></ol>
<div class="mw-heading mw-heading3"><h3 id="Die_Stage_(Bühne)"><span id="Die_Stage_.28B.C3.BChne.29"></span>Die Stage (Bühne)</h3></div>

<p>Der <code>start(...)</code>-Methode wird eine <code>Stage</code> übergeben. Der <a href="Parameter_(Informatik)" title="Parameter (Informatik)">Parameter</a> der <code>start(...)</code>-Methode ist also vom Typ <code>javafx.stage.Stage</code>. Diese Klasse ist der Top-Level-JavaFX-Container, der immer von der Plattform konstruiert wird – als Parameter der <code>start(...)</code>-Methode. Dies kann am ehesten mit dem <a href="Fenster_(Computer)" title="Fenster (Computer)">Startfenster</a> verglichen werden. Zusätzlich können in einer Applikation weitere Stage-<a href="Objekt_(Programmierung)" title="Objekt (Programmierung)">Objekte</a> erstellt werden.<sup id="cite_ref-Steyer29_23-0" class="reference"><a href="#cite_note-Steyer29-23"><span class="cite-bracket">[</span>20<span class="cite-bracket">]</span></a></sup>
</p><p>Die Stage kann verwendet werden, um eine oder mehrere Szenen (engl. <i>scenes</i>) zu präsentieren. Die Namensgebung der Basisklassen <code>Stage</code> und <code>Scene</code> ist ans Theater angelehnt: Die Stage ist die Bühne, auf der eine Szene aufgeführt wird. Sie bildet den Rahmen für den eigentlichen Inhalt.<sup id="cite_ref-Epple11_24-0" class="reference"><a href="#cite_note-Epple11-24"><span class="cite-bracket">[</span>21<span class="cite-bracket">]</span></a></sup>
</p><p>Für ein Stage-Objekt gibt es wie bei einem Fenster über entsprechende Methoden eine Vielzahl von Einstellungsmöglichkeiten, beispielsweise
</p>
<ul><li>legen <code>setWidth(double value)</code> und <code>setHeight(double value)</code> die Höhe und Breite der Stage fest, und</li>
<li><code>setTitle(java.lang.String value)</code> setzt den Titel des Fensters.</li></ul>
<p>Der <code>StageStyle</code> legt das Erscheinungsbild des Fensters fest. Der Standardwert ist <code>DECORATED</code>, der ein Fenster mit vom <a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a> abhängiger Umrandung und Bedienelementen und weißem Hintergrund anzeigt.<sup id="cite_ref-25" class="reference"><a href="#cite_note-25"><span class="cite-bracket">[</span>Anmerkung 4<span class="cite-bracket">]</span></a></sup> Die meisten Eigenschaften eines Stage-Objekts können jedoch nur gelesen werden, denn sie werden von der zugrunde liegenden Plattform geändert.<sup id="cite_ref-Steyer29_23-1" class="reference"><a href="#cite_note-Steyer29-23"><span class="cite-bracket">[</span>20<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Die_Scene_(Szene)"><span id="Die_Scene_.28Szene.29"></span>Die Scene (Szene)</h3></div>
<p>Auf der Stage (Bühne) werden in der Regel eine oder mehrere Szenen präsentiert, die vom Typ <code>javafx.scene.Scene</code> sind. Diese Klasse ist der Container für sämtlichen Inhalt in einem <a href="Szenengraph" title="Szenengraph">Szenengraphen</a>, der die einzelnen Bestandteile einer <a href="Grafische_Benutzeroberfl%C3%A4che" title="Grafische Benutzeroberfläche">GUI</a> verwaltet.
</p><p>Aus <a href="Graphentheorie" title="Graphentheorie">graphentheoretischer</a> Sicht ist der Szenengraph ein gewurzelter <a href="Baum_(Graphentheorie)" title="Baum (Graphentheorie)">Baum</a>, der aus Nodes (deutsch <a href="Knoten_(Graphentheorie)" title="Knoten (Graphentheorie)">Knoten</a>) besteht. Als <a href="Innerer_Knoten" class="mw-redirect" title="Innerer Knoten">innere Knoten</a> gibt es Parent-Nodes, die weitere Nodes (Knoten) als Kinder enthalten können. Ein <a href="Bl%C3%A4tter_und_innere_Knoten_in_der_Graphentheorie" title="Blätter und innere Knoten in der Graphentheorie">Blatt</a> (engl. <i>leaf node</i>) hat dagegen keine weiteren Kinder. Die Blätter stellen nun die sichtbaren Elemente der GUI dar (z.&nbsp;B. Buttons, Textfenster und Slider), die Parent-Nodes die unsichtbaren strukturellen Elemente (z.&nbsp;B. BorderPane, HBox und VBox). Eine Applikation muss den <a href="Wurzel_(Graphentheorie)" title="Wurzel (Graphentheorie)">Wurzelknoten</a> (engl. <i>root node</i>) für den Szenengraphen angeben. Das ist so etwas wie der Ursprung, aus dem sich die gesamte Szene entwickelt. Dafür gibt es ein Argument für den <a href="Konstruktoren_und_Destruktoren" title="Konstruktoren und Destruktoren">Konstruktor</a> eines <code>Scene</code>-Objekts. Die <code>Scene</code>-Objekte müssen im JavaFX-Application-<a href="Thread_(Informatik)" title="Thread (Informatik)">Thread</a> erstellt und modifiziert werden.<sup id="cite_ref-Steyer29_65_26-0" class="reference"><a href="#cite_note-Steyer29_65-26"><span class="cite-bracket">[</span>22<span class="cite-bracket">]</span></a></sup>
</p><p>Die <code>Scene</code> ist auch das Bindeglied zwischen dem Fenster, das vom Betriebssystem zur Verfügung gestellt wird, und dem Szenengraphen. Wird beispielsweise das Fenster vergrößert, versucht die <code>Scene</code>, diese Änderung an den Wurzelknoten weiterzugeben: Sie ruft dazu die Methode <code>isResizable</code> auf dem Root-Node auf, um herauszufinden, ob der Node auf Größenänderungen reagieren möchte. Gibt der Node <code>true</code> zurück, wird die <code>Scene</code> ihn auf die neue Größe verändern, bei <code>false</code> belässt sie ihn.<sup id="cite_ref-Epple13_27-0" class="reference"><a href="#cite_note-Epple13-27"><span class="cite-bracket">[</span>23<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-28" class="reference"><a href="#cite_note-28"><span class="cite-bracket">[</span>24<span class="cite-bracket">]</span></a></sup>
</p><p>Mit dem Befehl <code>stage.setScene(scene)</code> kommt der Szenengraph über die Klasse <code>Scene</code> auf die Bühne. Zu jedem Zeitpunkt sind alle grafischen Objekte einer JavaFX-Anwendung präsent, d.&nbsp;h. sie existieren nicht nur zum Zeitpunkt des Zeichnens.<sup id="cite_ref-Ullenboom1033_29-0" class="reference"><a href="#cite_note-Ullenboom1033-29"><span class="cite-bracket">[</span>25<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Nodes_(Knoten)"><span id="Nodes_.28Knoten.29"></span>Nodes (Knoten)</h3></div>

<p>Alle Objekte im Szenengraph sind vom Typ <code>Node</code>. Diese bilden also den Inhalt des Szenengraphen. Jeder Knoten und jedes Element im Szenengraphen ist wiederum ein Untertyp der abstrakten Klasse <code>Node</code>.
</p><p>Eine Unterklasse von <code>Node</code> ist <code>Parent</code>. Die Parent-Nodes sind die Basisklasse für alle Nodes, die weitere Nodes als Kinder enthalten, also Container sind. Von Parent gibt es wiederum Unterklassen:
</p>
<ul><li>Die Klasse <code>Group</code> fasst mehrere Elemente in einem Knoten zusammen. Sie ermöglicht es beispielsweise, dass Transformationen und Effekte auf die Gruppe angewendet werden und von dieser auf alle Elemente (Kinder) der Gruppe delegiert werden. Der <code>Group</code>-Node führt eine <code>ObservableList</code> von Kindern. Über die Methode <code>getChildren()</code> kann die Liste der Kinder abgerufen werden, der dann über <code>getChildren().add(element)</code> weitere Elemente hinzugefügt werden können. Eine <code>Group</code> kümmert sich nicht um die Positionen der Kinder und kann nicht über CSS angepasst werden.<sup id="cite_ref-30" class="reference"><a href="#cite_note-30"><span class="cite-bracket">[</span>26<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Ullenboom1034f_31-0" class="reference"><a href="#cite_note-Ullenboom1034f-31"><span class="cite-bracket">[</span>27<span class="cite-bracket">]</span></a></sup></li>
<li>Die Klasse <code>Region</code> bildet die Basisklasse für alle Controls und Layouts und erweitert die Basisklasse um viele Möglichkeiten für das Styling über CSS. Von <code>Region</code> gibt es eine Unterklasse <code>Pane</code>, die die Kinder über öffentliche Methoden nach außen gibt. Die davon abgeleitete Klasse <code>BorderPane</code> positioniert beispielsweise die Kinder oben (<i>top</i>), links (<i>left</i>), rechts (<i>right</i>), unten (<i>bottom</i>) und in der Mitte (<i>center</i>).</li>
<li>Die Klasse <code>Control</code> erweitert die Klasse <code>Region</code>. Sie ist die Basisklasse für Komponenten, die in irgendeiner Form Benutzereingaben erlauben. Dazu gehören beispielsweise Schaltflächen oder Beschriftungen. Jede Control-Komponente lässt sich über CSS wiederum optisch bearbeiten.<sup id="cite_ref-32" class="reference"><a href="#cite_note-32"><span class="cite-bracket">[</span>28<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Ullenboom1034f_31-1" class="reference"><a href="#cite_note-Ullenboom1034f-31"><span class="cite-bracket">[</span>27<span class="cite-bracket">]</span></a></sup></li></ul>
<p>JavaFX kommt – wie Swing – mit einem Satz von Standardkomponenten im Paket <code>javafx.scene.control</code> und hat <code>Control</code> als Basisklasse.<sup id="cite_ref-Ullenboom1036_33-0" class="reference"><a href="#cite_note-Ullenboom1036-33"><span class="cite-bracket">[</span>29<span class="cite-bracket">]</span></a></sup> Die folgende Übersicht listet die wichtigsten Controls auf, die in JavaFX zur Verfügung stehen:<sup id="cite_ref-Epple43f_34-0" class="reference"><a href="#cite_note-Epple43f-34"><span class="cite-bracket">[</span>30<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-35" class="reference"><a href="#cite_note-35"><span class="cite-bracket">[</span>31<span class="cite-bracket">]</span></a></sup>
</p>
<table class="wikitable">

<tbody><tr>
<th>Control</th>
<th>Verwendung
</th></tr>
<tr>
<td>Label</td>
<td>Das <a href="Label_(Steuerelement)" title="Label (Steuerelement)">Label</a> ist eines der einfachsten Controls. Es besteht aus einem Text und einem weiteren beliebigen Node zur Deklaration. Häufig wird hierfür ein Image verwendet.
</td></tr>
<tr>
<td>Hyperlink</td>
<td>Entspricht einem <a href="HTML" class="mw-redirect" title="HTML">HTML</a>-<a href="Hyperlink" title="Hyperlink">Hyperlink</a> und wird standardmäßig als blauer unterstrichener Text dargestellt.
</td></tr>
<tr>
<td>Button</td>
<td>Ein <a href="Schaltfl%C3%A4che" title="Schaltfläche">Button</a> kann gedrückt werden. Der Selektionszustand bleibt erhalten.
</td></tr>
<tr>
<td>RadioButton</td>
<td>Ein Auswahlknopf für die Einzelauswahl aus einer Gruppe von <a href="Radiobutton" title="Radiobutton">Radiobuttons</a>. Der Selektionszustand bleibt erhalten, bis ein anderer Button derselben Gruppe ausgewählt wird.
</td></tr>
<tr>
<td>ToggleButton</td>
<td>Eine <a href="Umschalter_(Steuerelement)" title="Umschalter (Steuerelement)">Umschaltfläche</a>, die in zwei Zuständen existiert: ausgewählt (selected) und nicht ausgewählt. Verhält sich ähnlich wie eine CheckBox oder ein RadioButton.
</td></tr>
<tr>
<td>CheckBox</td>
<td>Ein <a href="Checkbox" title="Checkbox">Checkbox</a> ist ein Auswahlkasten mit drei möglichen Zuständen: undefined, checked und unchecked. Der Selektionszustand bleibt bis zur Änderung erhalten.
</td></tr>
<tr>
<td>ChoiceBox</td>
<td>Eine <a href="Combobox" title="Combobox">Combobox</a> für die Auswahl eines einzelnen Items aus einer vorzugsweise kurzen Liste.
</td></tr>
<tr>
<td>TextField</td>
<td>Einzeiliges <a href="Textfeld" title="Textfeld">Freitexteingabefeld</a> mit <a href="Cursor" title="Cursor">Cursorsteuerung</a> und Selektion.
</td></tr>
<tr>
<td>TextArea</td>
<td>Mehrzeiliges Freitexteingabefeld mit Cursorsteuerung und Selektion.
</td></tr>
<tr>
<td>ListView</td>
<td>Ein (erweitertes) <a href="Listenfeld" title="Listenfeld">Listenfeld</a> zur Anzeige von Objekten.
</td></tr>
<tr>
<td>TableView</td>
<td>Eine <a href="Rasteransicht" title="Rasteransicht">Tabellenkomponente</a>, die sich aus einer Reihe von Spalten (TableColumns) zusammensetzt. Einzelne Zellen werden als TableCell repräsentiert.
</td></tr>
<tr>
<td>TitledPane</td>
<td>Ein auf- und zuklappbarer Teildialog.
</td></tr>
<tr>
<td>ScrollPane</td>
<td>Dient zum Verschieben und Darstellen eines Ausschnittes mit horizontalem und vertikalem ScrollBar (<a href="Rollbalken" class="mw-redirect" title="Rollbalken">Rollbalken</a>).
</td></tr></tbody></table>
<p>Zunächst sind Controls einfach nur Nodes, die dem SceneGraph hinzugefügt werden können, und die dann dargestellt werden. Natürlich stellen die entsprechenden Klassen für UI-Controls diverse spezifische Eigenschaften und Methoden zur Verfügung, um typische Interaktionen mit Anwendern zu unterstützen.
</p>
<div class="mw-heading mw-heading3"><h3 id="Programmbeispiele">Programmbeispiele</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Hello_JavaFX_World!"><span id="Hello_JavaFX_World.21"></span>Hello JavaFX World!</h4></div>

<p>Das folgende Programmbeispiel zeigt ein typisches <a href="Hallo-Welt-Programm" title="Hallo-Welt-Programm">Hallo-Welt-Programm</a> in JavaFX:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kn">package</span><span class="w"> </span><span class="nn">application</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.application.Application</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.scene.Scene</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.scene.control.Label</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.scene.layout.StackPane</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.stage.Stage</span><span class="p">;</span>

<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Main</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Application</span><span class="w"> </span><span class="p">{</span>

<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">start</span><span class="p">(</span><span class="n">Stage</span><span class="w"> </span><span class="n">primaryStage</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Label</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Label</span><span class="p">(</span><span class="s">"Hello JavaFX World!"</span><span class="p">);</span>

<span class="w"> </span><span class="n">StackPane</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StackPane</span><span class="p">();</span>
<span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="na">getChildren</span><span class="p">().</span><span class="na">add</span><span class="p">(</span><span class="n">label</span><span class="p">);</span>

<span class="w"> </span><span class="n">Scene</span><span class="w"> </span><span class="n">scene</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Scene</span><span class="p">(</span><span class="n">root</span><span class="p">,</span><span class="w"> </span><span class="mi">400</span><span class="p">,</span><span class="w"> </span><span class="mi">300</span><span class="p">);</span>

<span class="w"> </span><span class="n">primaryStage</span><span class="p">.</span><span class="na">setTitle</span><span class="p">(</span><span class="s">"Hello JavaFX World!"</span><span class="p">);</span>
<span class="w"> </span><span class="n">primaryStage</span><span class="p">.</span><span class="na">setScene</span><span class="p">(</span><span class="n">scene</span><span class="p">);</span>
<span class="w"> </span><span class="n">primaryStage</span><span class="p">.</span><span class="na">show</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">launch</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>

<span class="p">}</span>
</pre></div>
<p>Die Klasse <code>Main</code> ist von der Klasse <code>Application</code> abgeleitet. Die eigene <code>main(...)</code>-Methode leitet an die <code>launch(...)</code>-Methode der Application-Klasse weiter. In der erzeugten Instanz der <code>Application</code>-Klasse wird zunächst die <code>init()</code>-Methode ausgeführt, die hier als <i>default</i> leer implementiert bleibt.
</p><p>Als Nächstes wird die <code>start(...)</code>-Methode ausgeführt, die wie hier von jeder JavaFX-Anwendung überschrieben werden muss. JavaFX übergibt der Methode eine <code>Stage</code>, die mit dem Startfenster verglichen werden kann. Innerhalb der <code>start()</code>-Methode werden nun die folgenden Schritte ausgeführt:
</p>
<ul><li>Es wird ein einfaches Label-Control <code>label</code> kreiert. Der darzustellende Text „Hello JavaFX World!“ wird hier direkt dem Konstruktor übergeben.</li>
<li>Nun wird ein <code>StackPane</code> namens <code>root</code> erzeugt. Dieses platziert alle Kindelemente in der Reihenfolge ihres Hinzufügens übereinander. Standardmäßig werden die Komponenten in der StackPane zentriert. Über <code>root.getChildren().add(label)</code> wird nun das zuvor erzeugte <code>Label label</code> hinzugefügt.</li>
<li>Nun wird eine <code>Scene scene</code> erstellt, die sich anschließend auf die <code>Stage</code> laden lässt. Die Anwendung muss einen Root-Node (Wurzel-Knoten) für den Szenengraph spezifizieren. In diesem Beispiel ist dies das <code>root</code>-Objekt vom Typ <code>StackPane</code>. Außerdem wird hier dem Konstruktor noch eine spezifische Darstellungsgröße (<span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 400\times 300}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>400</mn>
<mo>×<!-- × --></mo>
<mn>300</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 400\times 300}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/64ef3875130de32ef85fd8ba877c585fe88cf867.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:9.815ex; height:2.176ex;" alt="{\displaystyle 400\times 300}" loading="lazy"></span>) mitgegeben.</li>
<li>Im nächsten Schritt wird über <code>primaryStage.setTitle("Hello JavaFX World!")</code> der Titel des Anwendungsfensters ebenfalls auf „Hello JavaFX World!“ gesetzt. Am wichtigsten ist aber die Zuweisung der Szene <code>scene</code>, die auf den eigentlichen Inhalt verweist. Die <code>show()</code>-Methode versucht nun das Fenster anzuzeigen, indem die Sichtbarkeit auf <code>true</code> gesetzt wird.</li></ul>
<div class="mw-heading mw-heading4"><h4 id="Cycle_of_Life">Cycle of Life</h4></div>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kn">package</span><span class="w"> </span><span class="nn">application</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.application.Application</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.application.Platform</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.stage.Stage</span><span class="p">;</span>

<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">CycleOfLife</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Application</span><span class="w"> </span><span class="p">{</span>

<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">init</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">printf</span><span class="p">(</span><span class="s">"Die Methode init(), aufgerufen im Thread %s%n"</span><span class="p">,</span>
<span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="na">currentThread</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">start</span><span class="p">(</span><span class="n">Stage</span><span class="w"> </span><span class="n">primaryStage</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">printf</span><span class="p">(</span><span class="s">"Die Methode start(), aufgerufen im Thread %s%n"</span><span class="p">,</span>
<span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="na">currentThread</span><span class="p">());</span>
<span class="w"> </span><span class="n">Platform</span><span class="p">.</span><span class="na">exit</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">stop</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">printf</span><span class="p">(</span><span class="s">"Die Methode stop(), aufgerufen im Thread %s%n"</span><span class="p">,</span>
<span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="na">currentThread</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">printf</span><span class="p">(</span><span class="s">"Die Methode main(), aufgerufen im Thread %s%n"</span><span class="p">,</span>
<span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="na">currentThread</span><span class="p">());</span>
<span class="w"> </span><span class="n">launch</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>

<span class="p">}</span>
</pre></div>
<p>Das Programm liefert in etwa den folgenden Output:
</p>
<dl><dd>Die Methode main(), aufgerufen im Thread Thread[main,5,main]</dd>
<dd>Die Methode init(), aufgerufen im Thread Thread[JavaFX-Launcher,5,main]</dd>
<dd>Die Methode start(), aufgerufen im Thread Thread[JavaFX Application Thread,5,main]</dd>
<dd>Die Methode stop(), aufgerufen im Thread Thread[JavaFX Application Thread,5,main]</dd></dl>
<p>Die <code>main(...)</code>-Methode von <code>CycleOfLife</code> ruft <code>Application.launch(...)</code> auf und eine Instanz der <code>Application</code>-Unterklasse wird im <i>JavaFX Application <a href="Thread_(Informatik)" title="Thread (Informatik)">Thread</a></i> erzeugt. Die <code>init()</code>-Methode wird im <i>JavaFX Launcher Thread</i> aufgerufen, bei welchem es sich um den Thread handelt, der die Applikation startet. Um die <code>start()</code>- und <code>stop()</code>-Methoden auszuführen, erzeugt JavaFX einen Thread namens <i>JavaFX Application Thread</i>. Die Erzeugung von <code>Stage</code>- und <code>Scene</code>-Objekten und Modifikationen am Szenengraphen müssen innerhalb dieses <i>JavaFX Application Thread</i> erfolgen.<sup id="cite_ref-36" class="reference"><a href="#cite_note-36"><span class="cite-bracket">[</span>32<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Ereignisbehandlung">Ereignisbehandlung</h2></div>
<p>Das Eventhandling von JavaFX ist die konsequente Weiterentwicklung der <a href="Ereignis_(Programmierung)" title="Ereignis (Programmierung)">Ereignisbehandlung</a> unter dem AWT und Swing beziehungsweise Java selbst, aber auch dem Web.<sup id="cite_ref-Steyer201_37-0" class="reference"><a href="#cite_note-Steyer201-37"><span class="cite-bracket">[</span>33<span class="cite-bracket">]</span></a></sup> Moderne grafische Programme sind sehr stark ereignisorientiert.<sup id="cite_ref-38" class="reference"><a href="#cite_note-38"><span class="cite-bracket">[</span>Anmerkung 5<span class="cite-bracket">]</span></a></sup> Man benötigt deshalb Mechanismen, die auf das Auftreten von Ereignissen reagieren.
</p><p>Ralph Steyer erklärt die Grundidee der Ereignisbehandlung folgendermaßen:
</p>
<dl><dd>Ein Objekt kann ein Ereignisobjekt abfeuern und ein anderes Objekt registriert sich für eine Reaktion darauf (ein sogenannter Event-Listener), wie etwa beim Funken, bei dem ein Sender mit seinem Funkgerät auf einer bestimmten Frequenz eine Nachricht schickt und ein Empfänger, der sein Funkgerät auf diese Frequenz eingestellt hat, die Nachricht empfängt. Vollkommen analog kann der Empfänger auf eine Mitteilung über ein Ereignis reagieren, oder die Nachricht ignorieren. Im Zuhörerobjekt wird also über die konkrete Ereignisbehandlung entschieden.<sup id="cite_ref-Steyer201_37-1" class="reference"><a href="#cite_note-Steyer201-37"><span class="cite-bracket">[</span>33<span class="cite-bracket">]</span></a></sup></dd></dl>
<div class="mw-heading mw-heading3"><h3 id="JavaFX-Events">JavaFX-Events</h3></div>
<p>Das Paket <code>javafx.event</code> enthält die relevanten Klassen und Schnittstellen zur Ereignisbehandlung in JavaFX. Grundsätzlich ist ein konkretes Ereignis eine Instanz der Klasse <code>javafx.event.Event</code> beziehungsweise einer ihrer Unterklassen wie <code>DragEvent</code>, <code>KeyEvent</code>, <code>MouseEvent</code> oder <code>ScrollEvent</code>.<sup id="cite_ref-Steyer201_37-2" class="reference"><a href="#cite_note-Steyer201-37"><span class="cite-bracket">[</span>33<span class="cite-bracket">]</span></a></sup>
</p><p>Wenn ein Ereignis auftritt, kommt ein interner Mechanismus zum Einsatz, der bestimmt, welcher Node (Knoten) das Ziel eines Ereignisobjektes ist. Für Mausereignisse ist beispielsweise das Ziel der Node am Ort des Mauszeigers. Von dem selektierten Ereignisziel gibt es eine Ereignisversandkette (engl. <i>event dispatch chain</i>), die bis zur Wurzel des Szenengraphen hochgeht.
</p><p>Zuerst wird immer versucht, das Ereignis im innersten Element, bei dem es aufgetreten ist, zu behandeln. Dies erfordert einen geeigneten Eventhandler (oder eine andere Behandlungsstruktur). Hiernach wird das Element des Ereignisobjekts an das nächsthöhere Objekt im Baum weitergeleitet usw. Man spricht in diesem Zusammenhang von Event-Bubbling, da das Ereignisobjekt wie eine Blase (engl. <i>bubble</i>) bis zur Wurzel des Szenengraphen aufsteigt. Wenn dieses bis zur Wurzel nicht behandelt werden kann, wird es vernichtet. Dies ist durchaus der Regelfall, da viele Ereignisse wie beispielsweise das Verschieben des Mauszeigers um wenige Millimeter keine konkrete Reaktion der Applikation erzwingen.<sup id="cite_ref-Steyer202_205_39-0" class="reference"><a href="#cite_note-Steyer202_205-39"><span class="cite-bracket">[</span>34<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Eventhandler">Eventhandler</h3></div>
<p>Wenn irgendein Node in der Route des Eventobjekts einen Eventhandler registriert hat, wird das Ereignis konsumiert. Die Aufgabe des Programmierers besteht also darin, das Ereignis entsprechend aufzufangen und die Reaktion auf dieses zu implementieren. Grundsätzlich implementieren Eventhandler die <code>EventHandler</code>-Schnittstelle, die das Überschreiben einer dort beschriebenen <code>handle()</code>-Methode erzwingt. Dort gehört dann die eigentliche Reaktion auf das aufgetretene Ereignis hin. Diese Methode enthält dann als Parameter ein Ereignisobjekt vom jeweils relevanten Typ.<sup id="cite_ref-Steyer205_209_40-0" class="reference"><a href="#cite_note-Steyer205_209-40"><span class="cite-bracket">[</span>35<span class="cite-bracket">]</span></a></sup>
</p><p>Eine allgemeine Möglichkeit, um einem Node-Objekt einen Eventhandler hinzuzufügen bzw. abzumelden bieten die folgenden beiden Methoden<sup id="cite_ref-Ullenboom1037_41-0" class="reference"><a href="#cite_note-Ullenboom1037-41"><span class="cite-bracket">[</span>36<span class="cite-bracket">]</span></a></sup>:
</p>
<ul><li><code>addEventHandler(EventType&lt;T&gt;, EventHandler&lt;? super T&gt;)</code> zum Hinzufügen eines Handlers</li>
<li><code>removeEventHandler(EventType&lt;T&gt;, EventHandler&lt;? super T&gt;)</code> zum Abmelden eines Handlers.</li></ul>
<p>Im ersten Parameter wird jeweils das konkrete Ereignis, auf das man reagieren will, spezifiziert, und im zweiten Parameter der Eventhandler selbst.
</p><p>Oft wird der Eventhandler als <a href="Anonyme_Klasse" class="mw-redirect" title="Anonyme Klasse">anonyme Klasse</a> erstellt und registriert und dabei die <code>handle()</code>-Methode direkt implementiert, um die gewünschten Aktionen bereitzustellen. Für einen <code>Button</code> <code>btn</code> könnte das in etwa folgendermaßen aussehen:<sup id="cite_ref-Ullenboom1037_41-1" class="reference"><a href="#cite_note-Ullenboom1037-41"><span class="cite-bracket">[</span>36<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">btn</span><span class="p">.</span><span class="na">addEventHandler</span><span class="p">(</span><span class="n">ActionEvent</span><span class="p">.</span><span class="na">ACTION</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">EventHandler</span><span class="o">&lt;</span><span class="n">ActionEvent</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">ActionEvent</span><span class="w"> </span><span class="n">event</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// do something here</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">});</span>
</pre></div>
<p>Als <a href="Anonyme_Funktion" title="Anonyme Funktion">Lambda-Ausdruck</a> kann dies in etwa folgendermaßen aussehen:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">btn</span><span class="p">.</span><span class="na">addEventHandler</span><span class="p">(</span><span class="n">ActionEvent</span><span class="p">.</span><span class="na">ACTION</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">event</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// do something here</span>
<span class="p">});</span>
</pre></div>
<p>Darüber hinaus bieten die Komponentenklassen auch eigene Setter-Methoden für spezifische Ereignisse an, die das folgende Format aufweisen:
</p>
<dl><dd><code>setOnEventType(EventHandler handler)</code></dd></dl>
<p>Dabei gibt <code>EventType</code> den Typ des Ereignisses an. So gibt es beispielsweise für den <code>Button</code> die Methode <code>setOnAction(EventHandler&lt;ActionEvent&gt;)</code>:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">btn</span><span class="p">.</span><span class="na">setOnAction</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">EventHandler</span><span class="o">&lt;</span><span class="n">ActionEvent</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">ActionEvent</span><span class="w"> </span><span class="n">event</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// do something here</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">});</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Dynamische_Datenstrukturen_mit_Änderungsmeldungen"><span id="Dynamische_Datenstrukturen_mit_.C3.84nderungsmeldungen"></span>Dynamische Datenstrukturen mit Änderungsmeldungen</h3></div>
<p>In JavaFX sind nicht nur einzelne Werte observierbar, sondern auch <a href="Dynamische_Datenstruktur" class="mw-redirect" title="Dynamische Datenstruktur">dynamische Datenstrukturen</a>, die sich im Paket <code>javafx.collections</code> befinden: <code>ObservableList</code>, <code>ObservableMap</code> und <code>ObservableSet</code> leiten sich jeweils vom <i>Observable Interface</i> ab und fügen jeweils Methoden hinzu, um die passenden <code>ChangeListener</code> zu registrieren. Die neuen Datenstrukturen erweitern also die <code>java.util</code>-Datenstrukturen <code>List</code>, <code>Set</code> und <code>Map</code> und können Veränderungen melden.
</p><p>Zu einer <code>ObservableList</code> existiert beispielsweise die Schnittstelle <code>ListChangeListener</code>, die auf Änderungen der observierten Liste reagiert. Die Klasse <code>ListChangeListener.Change</code> repräsentiert eine Änderung, die an einer solchen Liste vollzogen wird. Mit
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">observableList</span><span class="p">.</span><span class="na">addListener</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ListChangeListener</span><span class="p">(){</span><span class="cm">/* do something here */</span><span class="p">});</span>
</pre></div>
<p>wird dann der Listener für Veränderungen der Liste registriert.<sup id="cite_ref-Steyer193ff_42-0" class="reference"><a href="#cite_note-Steyer193ff-42"><span class="cite-bracket">[</span>37<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Ullenboom379_388_43-0" class="reference"><a href="#cite_note-Ullenboom379_388-43"><span class="cite-bracket">[</span>38<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Epple22f_44-0" class="reference"><a href="#cite_note-Epple22f-44"><span class="cite-bracket">[</span>39<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Properties_und_Data_Binding">Properties und Data Binding</h3></div>
<p>Properties und Data Binding sind zwei mächtige Sprach-Mechanismen in JavaFX, mit denen Beziehungen zwischen Variablen gestaltet werden können. Meist werden sie zur (gegenseitigen) Aktualisierung von Werten herangezogen. Der Benutzer bedient zum Beispiel einen Schieberegler, der die Breite eines Rechtecks regelt, und in Abhängigkeit vom eingestellten Wert muss der <code>width</code>-Wert des Datenmodells aktualisiert werden und die Fläche des Rechtecks neu berechnet werden. Um die Daten miteinander abzugleichen, gibt es deshalb das Konzept von Properties und Data Binding.
</p><p>Properties sind in JavaFX die Grundbausteine für die Verarbeitung und Kommunikation von Wertänderungen. Sie bilden die Basis für ein komfortables Data Binding. Ein Property ist ein Datencontainer, der zusätzlich Änderungsbenachrichtigungen ermöglicht. An Änderungen interessierte andere Klassen können sich als Listener registrieren. Man spricht bei einer Bindung auch von Abhängigkeiten beziehungsweise <i>dependency</i>.<sup id="cite_ref-Steyer225_45-0" class="reference"><a href="#cite_note-Steyer225-45"><span class="cite-bracket">[</span>40<span class="cite-bracket">]</span></a></sup>
</p><p>Die Binding-APIs werden in JavaFX in zwei Kategorien unterteilt:<sup id="cite_ref-Steyer225_45-1" class="reference"><a href="#cite_note-Steyer225-45"><span class="cite-bracket">[</span>40<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Oracle-Binding_46-0" class="reference"><a href="#cite_note-Oracle-Binding-46"><span class="cite-bracket">[</span>41<span class="cite-bracket">]</span></a></sup>
</p>
<ul><li>Das High-Level-API: Bietet für die meisten Situationen einen einfachen Weg zur Erstellung von Bindungen. Insbesondere wird hierfür in IDEs wie NetBeans eine Codevervollständigung bereitgestellt.</li>
<li>Das Low-Level-API: Dieses API ist sehr flexibel, schlank und schnell und bietet erweiterte Möglichkeiten, wenn das High-Level-API nicht ausreicht.</li></ul>
<p>Im Package <code>javafx.beans.property</code> sind verschiedene Property-Klassen definiert, etwa zur Kapselung von <code>int</code>, <code>long</code>, <code>float</code>, <code>double</code>, <code>boolean</code> und <code>String</code>. Zur Änderungsbenachrichtigung implementieren die Properties das Interface <code>Observable</code> bzw. <code>ObservableValue&lt;T&gt;</code>. So wird zum Beispiel anstatt des <a href="Primitiver_Datentyp" class="mw-redirect" title="Primitiver Datentyp">primitiven Datentyps</a> <a href="Doppelte_Genauigkeit" title="Doppelte Genauigkeit">double</a> ein neuer Typ <code>DoubleProperty</code> verwendet, der den primitiven Typ <code>double</code> „einwickelt“. Bei den JavaFX-Properties gibt es neben den <a href="Zugriffsfunktion" title="Zugriffsfunktion">Getter- und Setter-Methoden</a> noch eine zusätzliche Methode, die mit <i>Property</i> endet und das Property-Objekt zurückliefert.
</p><p>Das folgende Beispiel stammt aus den Java-Dokumentationen von Oracle und definiert eine Klasse namens <code>Bill</code> (deutsch <i>Rechnung</i>), die eine einzige Property namens <code>amountDue</code> (deutsch <i>fälliger Betrag</i>) implementiert:<sup id="cite_ref-Oracle-Binding_46-1" class="reference"><a href="#cite_note-Oracle-Binding-46"><span class="cite-bracket">[</span>41<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kn">package</span><span class="w"> </span><span class="nn">application</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.beans.property.DoubleProperty</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.beans.property.SimpleDoubleProperty</span><span class="p">;</span>

<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Bill</span><span class="w"> </span><span class="p">{</span>

<span class="w"> </span><span class="c1">// Definiere eine Variable um die Property zu speichern</span>
<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="n">DoubleProperty</span><span class="w"> </span><span class="n">amountDue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">SimpleDoubleProperty</span><span class="p">();</span>

<span class="w"> </span><span class="c1">// Definiere die Getter-Methode für den Wert der Property</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">getAmountDue</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">amountDue</span><span class="p">.</span><span class="na">get</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="c1">// Definiere die Setter-Methode für den Wert der Property</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">setAmountDue</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">value</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">amountDue</span><span class="p">.</span><span class="na">set</span><span class="p">(</span><span class="n">value</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="c1">// Definiere einen Getter für die Property selbst</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="n">DoubleProperty</span><span class="w"> </span><span class="nf">amountDueProperty</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">amountDue</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>

<span class="p">}</span>
</pre></div>
<p>Das <code>amountDue</code>-Objekt ist eine Instanz der Klasse <code>javafx.beans.property.DoubleProperty</code>. Um sie zu kapseln, ist sie als <code>private</code> markiert. Entsprechend der Namenskonvention für den Zugriff auf Properties gibt es die folgenden Methoden:
</p>
<ul><li>Die <code>getAmountDue()</code>-Methode ist der standardmäßige Getter, der den aktuellen Wert der <code>amountDue</code>-Property zurückgibt. Der Rückgabewert dieser Methode ist <code>double</code> (und nicht etwa <code>DoubleProperty</code>). Die Getter-Methode sollte als <code>final</code> deklariert werden.</li>
<li>Die <code>setAmountDue(double)</code>-Methode ist ebenfalls als <code>final</code> deklariert und ermöglicht es, von außen den Wert der Property zu setzen. Ihr Parameter ist ebenfalls <code>double</code>.</li>
<li>Die <code>amountDueProperty()</code>-Methode definiert den Getter der Property und gibt die Property selbst zurück. Sie ist eine neue Konvention, die sich aus dem Namen der Property (hier <i>amountDue</i>) und dem Wort <i>Property</i> zusammensetzt.</li></ul>
<p>Properties sind insbesondere dann von Interesse, wenn man deren Veränderungen beobachtet. Im Ereignismodell von Java gibt es sogenannte Ereignisauslöser (Ereignisquellen, engl. <i>event sources</i>), wie zum Beispiel Schaltflächen oder Schieberegler. Diese Ereignisse können von Benutzern der grafischen Oberfläche stammen, aber auch auf eigene Auslöser zurückzuführen sein. Neben den Ereignisauslösern gibt es eine Reihe von Interessenten, sogenannte Listener, die informiert werden wollen, wenn ein bestimmtes Ereignis auftritt.<sup id="cite_ref-Ullenboom806f_47-0" class="reference"><a href="#cite_note-Ullenboom806f-47"><span class="cite-bracket">[</span>42<span class="cite-bracket">]</span></a></sup> Zu den Properties existiert für diesen Fall ein <code>ChangeListener</code> (<code>javafx.beans.value.ChangeListener</code>), der über die Methode <code>addListener()</code> an die Property angehängt werden kann, die mit der entsprechenden Getter-Methode zurückgegeben wird.<sup id="cite_ref-Steyer228_231_48-0" class="reference"><a href="#cite_note-Steyer228_231-48"><span class="cite-bracket">[</span>43<span class="cite-bracket">]</span></a></sup>
</p><p>Zur Veranschaulichung eines ChangeListeners wird in den Java-Dokumentationen in der <code>Main</code>-Klasse eine Instanz <code>electricalBill</code> der Klasse <code>Bill</code> (siehe oben) erstellt:<sup id="cite_ref-Oracle-Binding_46-2" class="reference"><a href="#cite_note-Oracle-Binding-46"><span class="cite-bracket">[</span>41<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kn">package</span><span class="w"> </span><span class="nn">application</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.beans.value.ObservableValue</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.beans.value.ChangeListener</span><span class="p">;</span>

<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Main</span><span class="w"> </span><span class="p">{</span>

<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Bill</span><span class="w"> </span><span class="n">electricBill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Bill</span><span class="p">();</span>

<span class="w"> </span><span class="n">electricBill</span><span class="p">.</span><span class="na">amountDueProperty</span><span class="p">().</span><span class="na">addListener</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ChangeListener</span><span class="o">&lt;</span><span class="n">Object</span><span class="o">&gt;</span><span class="p">(){</span>
<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">changed</span><span class="p">(</span><span class="n">ObservableValue</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">o</span><span class="p">,</span><span class="n">Object</span><span class="w"> </span><span class="n">oldVal</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="n">newVal</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">"Electric bill has changed!"</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">});</span>

<span class="w"> </span><span class="n">electricBill</span><span class="p">.</span><span class="na">setAmountDue</span><span class="p">(</span><span class="mf">100.00</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>

<span class="p">}</span>
</pre></div>
<p>Als Ausgabe erscheint in der Konsole <i>Electric bill has changed!</i> Der Listener hat also bemerkt, dass mit <code>electricBill.setAmountDue(100.00)</code> der Wert der amountDue-Property geändert und die entsprechende Nachricht über die <code>changed(...)</code>-Methode ausgegeben wurde.
</p><p>Die High-Level-APIs sind der einfachste und schnellste Weg, um Bindings einzusetzen. Sie bestehen aus zwei Teilen: dem Fluent-API und der Binding-Klasse. Das Fluent-API stellt zahlreiche Methoden auf abhängigen Objekten bereit, während die Binding-Klasse statische Factory-Methoden anbietet.
</p><p>Im folgenden Beispiel werden zwei <a href="Integer_(Datentyp)" title="Integer (Datentyp)">Integers</a> so gebunden, dass ihre Werte immer automatisch in der <a href="Summe" title="Summe">Summe</a> <code>sum</code> addiert werden:<sup id="cite_ref-Oracle-Binding_46-3" class="reference"><a href="#cite_note-Oracle-Binding-46"><span class="cite-bracket">[</span>41<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kn">package</span><span class="w"> </span><span class="nn">application</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.beans.property.IntegerProperty</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.beans.property.SimpleIntegerProperty</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javafx.beans.binding.NumberBinding</span><span class="p">;</span>

<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Main</span><span class="w"> </span><span class="p">{</span>

<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">IntegerProperty</span><span class="w"> </span><span class="n">num1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">SimpleIntegerProperty</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="w"> </span><span class="n">IntegerProperty</span><span class="w"> </span><span class="n">num2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">SimpleIntegerProperty</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>

<span class="w"> </span><span class="n">NumberBinding</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">num1</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">num2</span><span class="p">);</span>

<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">sum</span><span class="p">.</span><span class="na">getValue</span><span class="p">());</span>

<span class="w"> </span><span class="n">num1</span><span class="p">.</span><span class="na">set</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>

<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">sum</span><span class="p">.</span><span class="na">getValue</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>

<span class="p">}</span>
</pre></div>
<p>Es gibt insgesamt drei Variablen, nämlich die beiden abhängigen Variablen <code>num1</code> und <code>num2</code> und die Bindung <code>sum</code>. Die abhängigen Variablen sind beide vom Typ <code>IntegerProperty</code> und die Bindung selbst ist vom Typ <code>NumberBinding</code>. Der Wert von <code>sum</code> ändert sich also automatisch, wenn sich <code>num1</code> oder <code>num2</code> ändern.
</p>
<div class="mw-heading mw-heading2"><h2 id="Deklarative_GUI-Beschreibungen">Deklarative GUI-Beschreibungen</h2></div>
<p>Grundsätzlich können grafische Oberflächen über eine Programm-API aufgebaut werden, oder aber in einer <a href="Deklarative_Programmierung" title="Deklarative Programmierung">deklarativen</a> Beschreibung spezifiziert werden. Bei deklarativen Oberflächen wird die Anordnung der Komponenten in einer externen Ressourcendatei beschrieben.
</p>
<div class="mw-heading mw-heading3"><h3 id="FXML">FXML</h3></div>
<p>Neben der Möglichkeit, den Szenengraphen über den Programmcode aufzubauen, bietet JavaFX auch die Möglichkeit, die Objekte über <a href="Extensible_Markup_Language" title="Extensible Markup Language">XML</a> zu konfigurieren. Mit FXML stellt JavaFX eine einfach zu erlernende, deklarative Sprache zur Verfügung, die eine alternative Definition von grafischen Oberflächen rein über XML erlaubt.<sup id="cite_ref-49" class="reference"><a href="#cite_note-49"><span class="cite-bracket">[</span>Anmerkung 6<span class="cite-bracket">]</span></a></sup> Da XML hierarchisch strukturiert ist, kann die grundlegende hierarchische Gliederung einer GUI in Containern und Komponenten sehr gut auf XML-Basis abgebildet werden. Dies macht es auch einfacher, das Layout sauber vom Code zu trennen. Darüber hinaus können dort Web-Technologien wie <a href="Cascading_Style_Sheets" title="Cascading Style Sheets">CSS</a> (Cascading Style Sheets), <a href="JavaScript" title="JavaScript">JavaScript</a> aber auch andere Sprachen wie <a href="Groovy" title="Groovy">Groovy</a> eingesetzt werden, indem sie in den XML-Code eingebettet und damit verknüpft werden.<sup id="cite_ref-Steyer9f_50-0" class="reference"><a href="#cite_note-Steyer9f-50"><span class="cite-bracket">[</span>44<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Ullenboom1062f_51-0" class="reference"><a href="#cite_note-Ullenboom1062f-51"><span class="cite-bracket">[</span>45<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Inselbuch1013f_52-0" class="reference"><a href="#cite_note-Inselbuch1013f-52"><span class="cite-bracket">[</span>46<span class="cite-bracket">]</span></a></sup>
</p><p>Zum Laden einer FXML-Ressource kommt die Klasse <code>javafx.fxml.FXMLLoader</code> und dessen Klassenmethode <code>load(...)</code> zum Einsatz. Hier muss der relative Pfad zur <code>*.fxml</code>-Datei als Parameter übergeben werden. Nun kann die angegebene Datei als Ressource geladen und daraus ein Objekt vom Typ <code>javafx.scene.Parent</code> erzeugt werden. Dieses wird dem Konstruktor des Scene-Objekts als Parameter übergeben.<sup id="cite_ref-Steyer65f_53-0" class="reference"><a href="#cite_note-Steyer65f-53"><span class="cite-bracket">[</span>47<span class="cite-bracket">]</span></a></sup>
</p><p>In den Java-Dokumentationen wird der Unterschied zwischen Code und FXML am folgenden einfachen Beispiel veranschaulicht:<sup id="cite_ref-54" class="reference"><a href="#cite_note-54"><span class="cite-bracket">[</span>48<span class="cite-bracket">]</span></a></sup>
</p><p>Der folgende Programmcode baut eine grafische Oberfläche auf, die aus einem <code>BorderPane</code> besteht, das oben das <code>Label</code> mit der Beschriftung <i>Page Title</i> enthält und im Zentrum ein <code>Label</code> mit der Beschriftung <i>Some data here</i>:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">BorderPane</span><span class="w"> </span><span class="n">border</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BorderPane</span><span class="p">();</span>
<span class="n">Label</span><span class="w"> </span><span class="n">toppanetext</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Label</span><span class="p">(</span><span class="s">"Page Title"</span><span class="p">);</span>
<span class="n">border</span><span class="p">.</span><span class="na">setTop</span><span class="p">(</span><span class="n">toppanetext</span><span class="p">);</span>
<span class="n">Label</span><span class="w"> </span><span class="n">centerpanetext</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Label</span><span class="w"> </span><span class="p">(</span><span class="s">"Some data here"</span><span class="p">);</span>
<span class="n">border</span><span class="p">.</span><span class="na">setCenter</span><span class="p">(</span><span class="n">centerpanetext</span><span class="p">);</span>
</pre></div>
<p>Dieselbe Oberfläche wird in FXML folgendermaßen beschrieben:
</p>
<div class="mw-highlight mw-highlight-lang-xml mw-content-ltr" dir="ltr"><pre><span></span><span class="nt">&lt;BorderPane&gt;</span>
<span class="w"> </span><span class="nt">&lt;top&gt;</span>
<span class="w"> </span><span class="nt">&lt;Label</span><span class="w"> </span><span class="na">text=</span><span class="s">"Page Title"</span><span class="nt">/&gt;</span>
<span class="w"> </span><span class="nt">&lt;/top&gt;</span>
<span class="w"> </span><span class="nt">&lt;center&gt;</span>
<span class="w"> </span><span class="nt">&lt;Label</span><span class="w"> </span><span class="na">text=</span><span class="s">"Some data here"</span><span class="nt">/&gt;</span>
<span class="w"> </span><span class="nt">&lt;/center&gt;</span>
<span class="nt">&lt;/BorderPane&gt;</span>
</pre></div>
<p>Die hierarchische Struktur der Oberfläche kann also sehr gut in der hierarchisch strukturierten <a href="Auszeichnungssprache" title="Auszeichnungssprache">Auszeichnungssprache</a> FXML dargestellt werden. Dies macht es einfacher, Komponenten hinzuzufügen und die Gliederung einer GUI aufzubauen.
</p>
<div class="mw-heading mw-heading3"><h3 id="Der_Scene_Builder">Der Scene Builder</h3></div>
<p>Der JavaFX Scene Builder ist ein grafisches Tool, das die Erstellung von FXML-Dateien vereinfacht. Mit dem Tool können GUI-Elemente ohne Programmierkenntnisse entworfen werden. Der Anwender kann per <a href="Drag_and_Drop" title="Drag and Drop">Drag and Drop</a> die XML-Strukturen von FXML visuell gestalten und generieren lassen.<sup id="cite_ref-55" class="reference"><a href="#cite_note-55"><span class="cite-bracket">[</span>Anmerkung 7<span class="cite-bracket">]</span></a></sup>
</p><p>Oracle hat die Entwicklung des Tools eingestellt und den <a href="Quelltext" title="Quelltext">Quelltext</a> des Programms unter einer BSD-ähnlichen Lizenz freigegeben.<sup id="cite_ref-56" class="reference"><a href="#cite_note-56"><span class="cite-bracket">[</span>49<span class="cite-bracket">]</span></a></sup>
Daraufhin hat die Firma Gluon die Wartung und den kommerziellen Support übernommen.<sup id="cite_ref-57" class="reference"><a href="#cite_note-57"><span class="cite-bracket">[</span>50<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="FXGraph">FXGraph</h3></div>
<p>FXGraph ist eine einfache <a href="Dom%C3%A4nenspezifische_Sprache" title="Domänenspezifische Sprache">DSL</a> (<i>Domain Specific Language</i>) zur Definition des Objektgraphen, der im Hintergrund in FXML umgesetzt wird. FXGraph stammt aus dem Projekt e(fx)clipse, eine JavaFX-Unterstützung in <a href="Eclipse_(IDE)" title="Eclipse (IDE)">Eclipse</a>.<sup id="cite_ref-58" class="reference"><a href="#cite_note-58"><span class="cite-bracket">[</span>51<span class="cite-bracket">]</span></a></sup> FXGraph ist kompakter als FXML und erinnert entfernt an <a href="JSON" title="JSON">JSON</a>.<sup id="cite_ref-Inselbuch1014_59-0" class="reference"><a href="#cite_note-Inselbuch1014-59"><span class="cite-bracket">[</span>52<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Kritik">Kritik</h2></div>
<p>Der ehemalige Sun-Mitarbeiter und Codename-One-Gründer Shai Almog bescheinigt JavaFX eine wenig rosige Zukunft. Er teilt JavaFX-Nutzer in drei Kategorien: Unternehmen mit großen Investitionen in Swing, Studenten und eingefleischte Fans. Auf diesem Fundament lasse sich laut Almog nur schwer eine lebhafte <a href="Online-Community" title="Online-Community">Community</a> aufbauen. Außerdem sende Oracle keine klaren Signale aus, wie es um sein zukünftiges Engagement für JavaFX bestellt sei. Insgesamt macht er für die mangelnde Zukunft von JavaFX drei Hauptgründe verantwortlich:
</p>
<ul><li>Oracle selbst nutzt JavaFX nicht bzw. nicht in ausreichendem Maße: Selbst Swing-basierte Produkte bewegen sich nicht in Richtung JavaFX. Zudem wird der Scene Builder seit einiger Zeit nicht mehr von Oracle selbst vertrieben.</li>
<li>JavaFX hat nie denselben Einfluss wie Swing gewonnen. Die Hauptzielgruppe von JavaFX, nämlich die Swing-Entwickler, seien nicht auf die neue Technologie umgestiegen.</li>
<li>Der Jobmarkt sehe düster aus: Auf der Karriereseite <i>dice.com</i> fand Almog nur 28 Stellen, die JavaFX-Kenntnisse verlangten, im Gegensatz zu 198 Stellenangebote für Swing, 2333 für <a href="Android_(Betriebssystem)" title="Android (Betriebssystem)">Android</a> und 16752 für Java EE (Stand 22. November 2015).<sup id="cite_ref-Almog_60-0" class="reference"><a href="#cite_note-Almog-60"><span class="cite-bracket">[</span>53<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-61" class="reference"><a href="#cite_note-61"><span class="cite-bracket">[</span>54<span class="cite-bracket">]</span></a></sup></li></ul>
<p>Nachdem der Support für die ARM Embedded Platform und die Entwicklung des Scene Builders von Oracle eingestellt wurden, forderte unter anderem der iJUG-Verbund (Interessenverbund deutscher Java User Groups) von Oracle ein explizites Bekenntnis zu JavaFX.<sup id="cite_ref-62" class="reference"><a href="#cite_note-62"><span class="cite-bracket">[</span>55<span class="cite-bracket">]</span></a></sup> Daraufhin stellte Don Smith (Oracle Senior Director Product Management) klar, dass JavaFX auch weiterhin die empfohlene Technologie für die Entwicklung von Rich Clients sei und diesbezüglich auch weiterentwickelt werde. Der wegfallende Support der ARM-Plattform habe mit dem hohen Aufwand zu tun, angesichts einer sich sehr schnell verändernden Hardware-Technik einen nachhaltigen kommerziellen ARM-Support zu garantieren. Der Scene Builder sei unter der offenen <a href="BSD-Lizenz" title="BSD-Lizenz">BSD-Lizenz</a> verfügbar gemacht worden und die Strategie bestehe nun darin, den Scene Builder in Tools und Entwicklungsplattformen zu integrieren. Smith verweist insbesondere auf das Startup Gluon, das sich mit JavaFX-Ports und dem Scene Builder befasst.<sup id="cite_ref-Schlosser_63-0" class="reference"><a href="#cite_note-Schlosser-63"><span class="cite-bracket">[</span>56<span class="cite-bracket">]</span></a></sup>
</p><p>Insgesamt steht Java in Konkurrenz mit zahlreichen anderen Technologien: Auf der Serverseite beispielsweise mit <a href="Node.js" title="Node.js">Node.js</a> und <a href="Ruby_on_Rails" title="Ruby on Rails">Ruby on Rails</a>, auf Mobile-Seite mit <a href="IOS_(Betriebssystem)" title="IOS (Betriebssystem)">iOS</a> und in den Bereichen Mobile und Desktop mit HTML und JavaScript.<sup id="cite_ref-Almog_60-1" class="reference"><a href="#cite_note-Almog-60"><span class="cite-bracket">[</span>53<span class="cite-bracket">]</span></a></sup> Ob sich JavaFX als Technologie für Web-Oberflächen durchsetzen wird, muss die Zeit noch zeigen.
</p><p>Einige Experten sehen für JavaFX insbesondere eine Nische im Bereich mächtiger Desktop-Clients mit anspruchsvoller grafischer Interaktion, in der es sich dauerhaft etablieren könnte. So sehen sie die Stärken des Frameworks nicht zuletzt bei der Entwicklung hybrider Desktopanwendungen. Auch jeder, der einen Client mit direktem Zugriff auf lokale Ressourcen (Dateisystem, serielle Ressourcen usw.) entwickelt, sei mit JavaFX gut aufgehoben.<sup id="cite_ref-Schlosser_63-1" class="reference"><a href="#cite_note-Schlosser-63"><span class="cite-bracket">[</span>56<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-64" class="reference"><a href="#cite_note-64"><span class="cite-bracket">[</span>57<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Anton Epple: <i>JavaFX 8. Grundlagen und fortgeschrittene Techniken.</i> dpunkt.verlag: Heidelberg, 2015.</li>
<li>Ralph Steyer: <i>Einführung in JavaFX. Moderne GUIs für RIAs und Java-Applikationen.</i> Springer Vieweg: Wiesbaden, 2014.</li>
<li>Christian Ullenboom: <i>Java ist auch eine Insel. Einführung, Ausbildung, Praxis.</i> 11. Auflage. Galileo Press: Bonn, 2014, insb. S. 1009–1063.</li>
<li>Christian Ullenboom: <i>Java SE 8 Standard-Bibliothek. Das Handbuch für Java-Entwickler.</i> 2. Auflage. 2014, Galileo Press: Bonn, 2014, insb. S. 1031–1076.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li>Oracle: <a rel="nofollow" class="external text" href="http://docs.oracle.com/javase/8/javase-clienttechnologies.htm">Java Platform, Standard Edition (Java SE) 8</a> <i>Java-Dokumentationen von Oracle</i></li>
<li>Jonathan Giles, Jasper Potts und Richard Bair: <a rel="nofollow" class="external text" href="http://fxexperience.com/">fx experience</a> <i>Link-Sammlung zu Beiträgen, die JavaFX-Neuerungen beschreiben</i></li>
<li>Christian Ullenboom, u.&nbsp;a.: <a rel="nofollow" class="external text" href="http://www.tutego.de/blog/javainsel/">Java Blog</a> <i>Zahlreiche Beiträge zu Java und JavaFX</i></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-_4a1e7bf7ce4315c6-1"><span class="mw-cite-backlink"><a href="#cite_ref-_4a1e7bf7ce4315c6_1-0">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://gluonhq.com/products/javafx/openjfx-21-release-notes/"><cite style="font-style:italic"><span lang="en">21.0.6 January 21, 2025 release notes</span></cite>.</a> 21.&nbsp;Januar 2025 (abgerufen am 4.&nbsp;Februar 2025).</span>
</li>
<li id="cite_note-Inselbuch1011-2"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Inselbuch1011_2-0">a</a></sup> <sup><a href="#cite_ref-Inselbuch1011_2-1">b</a></sup> <sup><a href="#cite_ref-Inselbuch1011_2-2">c</a></sup> <sup><a href="#cite_ref-Inselbuch1011_2-3">d</a></sup></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java ist auch eine Insel</cite>. 11. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2873-2, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1011</span> (1306 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+ist+auch+eine+Insel&amp;rft.date=2014&amp;rft.edition=11&amp;rft.genre=book&amp;rft.isbn=9783836228732&amp;rft.pages=1011&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html"><i>JavaFX Frequently Asked Questions.</i></a> In: <i>oracle.com.</i><span class="Abrufdatum"> Abgerufen am 29.&nbsp;Februar 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX+Frequently+Asked+Questions&amp;rft.description=JavaFX+Frequently+Asked+Questions&amp;rft.identifier=https%3A%2F%2Fwww.oracle.com%2Ftechnetwork%2Fjava%2Fjavafx%2Foverview%2Ffaq-1446554.html&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><span class="cite">Donald Smith: <a rel="nofollow" class="external text" href="https://blogs.oracle.com/java/post/the-future-of-javafx-and-other-java-client-roadmap-updates"><i>The Future of JavaFX and Other Java Client Roadmap Updates.</i></a> In: <i>blogs.oracle.com.</i> 7.&nbsp;März 2018,<span class="Abrufdatum"> abgerufen am 17.&nbsp;November 2018</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=The+Future+of+JavaFX+and+Other+Java+Client+Roadmap+Updates&amp;rft.description=The+Future+of+JavaFX+and+Other+Java+Client+Roadmap+Updates&amp;rft.identifier=https%3A%2F%2Fblogs.oracle.com%2Fjava%2Fpost%2Fthe-future-of-javafx-and-other-java-client-roadmap-updates&amp;rft.creator=Donald+Smith&amp;rft.date=2018-03-07&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><span class="cite">Josh Marinacci: <a rel="nofollow" class="external text" href="https://web.archive.org/web/20081207095309/http://blogs.sun.com/javafx/entry/javafx_1_0_is_live"><i>JavaFX 1.0 is Live.</i></a> In: <i>blogs.sun.com.</i> 4.&nbsp;Dezember 2008, archiviert vom <style data-mw-deduplicate="TemplateStyles:r250917974">
/* start https://de.wikipedia.org/ */


.mw-parser-output .dewiki-iconexternal>a{background-position:center right!important;background-repeat:no-repeat!important}body.skin-minerva .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/OOjs_UI_icon_external-link-ltr-progressive.svg")!important;background-size:10px!important;padding-right:13px!important}body.skin-timeless .mw-parser-output .dewiki-iconexternal>a,body.skin-monobook .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/MediaWiki_external_link_icon.svg")!important;padding-right:13px!important}body.skin-vector .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/Link.ernal-small-ltr-progressive.svg")!important;background-size:0.857em!important;padding-right:1em!important}


/* end https://de.wikipedia.org/ */
</style><span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fblogs.sun.com%2Fjavafx%2Fentry%2Fjavafx_1_0_is_live">Original</a></span> (nicht mehr online verfügbar) am <span style="white-space:nowrap;">7.&nbsp;Dezember 2008</span><span>;</span><span class="Abrufdatum"> abgerufen am 17.&nbsp;April 2018</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX+1.0+is+Live&amp;rft.description=JavaFX+1.0+is+Live&amp;rft.identifier=https%3A%2F%2Fweb.archive.org%2Fweb%2F20081207095309%2Fhttp%3A%2F%2Fblogs.sun.com%2Fjavafx%2Fentry%2Fjavafx_1_0_is_live&amp;rft.creator=Josh+Marinacci&amp;rft.date=2008-12-04&amp;rft.source=http://blogs.sun.com/javafx/entry/javafx_1_0_is_live&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text"><span class="cite">Jacob Lehrbaum: <a rel="nofollow" class="external text" href="https://web.archive.org/web/20100426031216/http://blogs.sun.com:80/javafx/entry/javafx_1_3_released_delivers"><i>JavaFX 1.3 Released.</i></a> In: <i>blogs.sun.com.</i> 22.&nbsp;April 2010, archiviert vom <span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fblogs.sun.com%2Fjavafx%2Fentry%2Fjavafx_1_3_released_delivers">Original</a></span> (nicht mehr online verfügbar) am <span style="white-space:nowrap;">26.&nbsp;April 2010</span><span>;</span><span class="Abrufdatum"> abgerufen am 27.&nbsp;Oktober 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX+1.3+Released&amp;rft.description=JavaFX+1.3+Released&amp;rft.identifier=https%3A%2F%2Fweb.archive.org%2Fweb%2F20100426031216%2Fhttp%3A%2F%2Fblogs.sun.com%3A80%2Fjavafx%2Fentry%2Fjavafx_1_3_released_delivers&amp;rft.creator=Jacob+Lehrbaum&amp;rft.date=2010-04-22&amp;rft.source=http://blogs.sun.com/javafx/entry/javafx_1_3_released_delivers&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20101029215752/http://javafx.com/roadmap/"><i>JavaFX 2010–2011 Roadmap.</i></a> In: <i>javafx.com.</i> Archiviert vom <span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fjavafx.com%2Froadmap%2F">Original</a></span> (nicht mehr online verfügbar) am <span style="white-space:nowrap;">29.&nbsp;Oktober 2010</span><span>;</span><span class="Abrufdatum"> abgerufen am 17.&nbsp;April 2018</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX+2010%E2%80%932011+Roadmap&amp;rft.description=JavaFX+2010%E2%80%932011+Roadmap&amp;rft.identifier=https%3A%2F%2Fweb.archive.org%2Fweb%2F20101029215752%2Fhttp%3A%2F%2Fjavafx.com%2Froadmap%2F&amp;rft.source=http://javafx.com/roadmap/&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a></span> <span class="reference-text"><span class="cite">Markus Franz: <a rel="nofollow" class="external text" href="https://web.archive.org/web/20161203021157/https://www.netzwelt.de/news/88783_2-javafx-2-0-flash-konkurrent-open-source.html"><i>JavaFX 2.0: Flash-Konkurrent wird Open Source.</i></a> In: <i>netzwelt.de.</i> 5.&nbsp;Oktober 2011, archiviert vom <span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=https%3A%2F%2Fwww.netzwelt.de%2Fnews%2F88783_2-javafx-2-0-flash-konkurrent-open-source.html">Original</a></span> (nicht mehr online verfügbar) am <span style="white-space:nowrap;">3.&nbsp;Dezember 2016</span><span>;</span><span class="Abrufdatum"> abgerufen am 13.&nbsp;Oktober 2011</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX+2.0%3A+Flash-Konkurrent+wird+Open+Source&amp;rft.description=JavaFX+2.0%3A+Flash-Konkurrent+wird+Open+Source&amp;rft.identifier=https%3A%2F%2Fweb.archive.org%2Fweb%2F20161203021157%2Fhttps%3A%2F%2Fwww.netzwelt.de%2Fnews%2F88783_2-javafx-2-0-flash-konkurrent-open-source.html&amp;rft.creator=Markus+Franz&amp;rft.date=2011-10-05&amp;rft.source=https://www.netzwelt.de/news/88783_2-javafx-2-0-flash-konkurrent-open-source.html&amp;rft.language=de">&nbsp;</span></span>
</li>
<li id="cite_note-Inselbuch1012-9"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Inselbuch1012_9-0">a</a></sup> <sup><a href="#cite_ref-Inselbuch1012_9-1">b</a></sup></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java ist auch eine Insel</cite>. 11. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2873-2, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1012</span> (1306 Seiten, <a rel="nofollow" class="external text" href="https://books.google.de/books?id=LCNWngEACAAJ&amp;pg=PA1012#v=onepage">eingeschränkte Vorschau</a> in der Google-Buchsuche).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+ist+auch+eine+Insel&amp;rft.date=2014&amp;rft.edition=11&amp;rft.genre=book&amp;rft.isbn=9783836228732&amp;rft.pages=1012&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><a href="#cite_ref-10">↑</a></span> <span class="reference-text"><span class="cite">Hendrik Ebbers: <a rel="nofollow" class="external text" href="https://jaxenter.de/javafx-8-was-ist-neu-1391"><i>JavaFX8 – Was ist neu?</i></a> In: <i>jaxenter.de.</i> 20.&nbsp;März 2014,<span class="Abrufdatum"> abgerufen am 12.&nbsp;Dezember 2016</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX8+%E2%80%93+Was+ist+neu%3F&amp;rft.description=JavaFX8+%E2%80%93+Was+ist+neu%3F&amp;rft.identifier=https%3A%2F%2Fjaxenter.de%2Fjavafx-8-was-ist-neu-1391&amp;rft.creator=Hendrik+Ebbers&amp;rft.date=2014-03-20&amp;rft.language=de">&nbsp;</span></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><a href="#cite_ref-11">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.oracle.com/java/technologies/javase/jdk-8u33-arm-relnotes.html"><i>Java Development Kit for ARM Release Notes 8 Update 33.</i></a> In: <i>oracle.com.</i> 16.&nbsp;Februar 2013,<span class="Abrufdatum"> abgerufen am 29.&nbsp;Februar 2016</span> (englisch): „Starting with JDK 8u33, JavaFX Embedded is removed from the ARM bundle and is not supported.“</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Java+Development+Kit+for+ARM+Release+Notes+8+Update+33&amp;rft.description=Java+Development+Kit+for+ARM+Release+Notes+8+Update+33&amp;rft.identifier=https%3A%2F%2Fwww.oracle.com%2Fjava%2Ftechnologies%2Fjavase%2Fjdk-8u33-arm-relnotes.html&amp;rft.date=2013-02-16&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><a href="#cite_ref-12">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.oracle.com/technetwork/java/javase/javaclientroadmapupdatev2020may-6548840.pdf"><i>Java Client Roadmap Update.</i></a> (PDF; 264&nbsp;kB) In: <i>oracle.com.</i> Oracle Corporation, 11.&nbsp;Mai 2020,<span class="Abrufdatum"> abgerufen am 14.&nbsp;Februar 2021</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Java+Client+Roadmap+Update&amp;rft.description=Java+Client+Roadmap+Update&amp;rft.identifier=https%3A%2F%2Fwww.oracle.com%2Ftechnetwork%2Fjava%2Fjavase%2Fjavaclientroadmapupdatev2020may-6548840.pdf&amp;rft.publisher=Oracle+Corporation&amp;rft.date=2020-05-11&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer166f-13"><span class="mw-cite-backlink"><a href="#cite_ref-Steyer166f_13-0">↑</a></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>166<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>., <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=166f&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><a href="#cite_ref-14">↑</a></span> <span class="reference-text"><span class="cite">Cindy Castillo: <a rel="nofollow" class="external text" href="https://docs.oracle.com/javafx/2/architecture/jfxpub-architecture.htm"><i>JavaFX Architecture.</i></a> In: <i>docs.oracle.com.</i> April 2013,<span class="Abrufdatum"> abgerufen am 14.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX+Architecture&amp;rft.description=JavaFX+Architecture&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavafx%2F2%2Farchitecture%2Fjfxpub-architecture.htm&amp;rft.creator=Cindy+Castillo&amp;rft.date=2013-04&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer8f-16"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Steyer8f_16-0">a</a></sup> <sup><a href="#cite_ref-Steyer8f_16-1">b</a></sup> <sup><a href="#cite_ref-Steyer8f_16-2">c</a></sup> <sup><a href="#cite_ref-Steyer8f_16-3">d</a></sup></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>8<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>., <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=8f&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><a href="#cite_ref-17">↑</a></span> <span class="reference-text">Gerrit Grunwald: <a rel="nofollow" class="external text" href="https://heise.de/-1902233"><span style="font-style:italic;">Visualisierung in Java mit JavaFX.</span></a> In: <i><a href="Heise_online" title="Heise online">Heise online</a>.</i> <span style="white-space:nowrap;">28.&nbsp;Juni 2013</span>. Abgerufen am 14.&nbsp;Dezember 2016.</span>
</li>
<li id="cite_note-Ullenboom1032-19"><span class="mw-cite-backlink"><a href="#cite_ref-Ullenboom1032_19-0">↑</a></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java SE 8 Standard-Bibliothek</cite>. 2. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2874-9, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1032</span> (1448 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+SE+8+Standard-Bibliothek&amp;rft.date=2014&amp;rft.edition=2&amp;rft.genre=book&amp;rft.isbn=9783836228749&amp;rft.pages=1032&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-20"><span class="mw-cite-backlink"><a href="#cite_ref-20">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html"><i>Class Application.</i></a> In: <i>docs.oracle.com.</i><span class="Abrufdatum"> Abgerufen am 11.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Class+Application&amp;rft.description=Class+Application&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavase%2F8%2Fjavafx%2Fapi%2Fjavafx%2Fapplication%2FApplication.html&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Epple9f-21"><span class="mw-cite-backlink"><a href="#cite_ref-Epple9f_21-0">↑</a></span> <span class="reference-text">Anton Epple: <cite style="font-style:italic">JavaFX 8: Grundlagen und fortgeschrittene Techniken</cite>. 1. Auflage. dpunkt.verlag, Heidelberg 2015, ISBN 978-3-86490-169-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>9<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>. (296 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Anton+Epple&amp;rft.btitle=JavaFX+8%3A+Grundlagen+und+fortgeschrittene+Techniken&amp;rft.date=2015&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783864901690&amp;rft.pages=9f&amp;rft.place=Heidelberg&amp;rft.pub=dpunkt.verlag" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer29-23"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Steyer29_23-0">a</a></sup> <sup><a href="#cite_ref-Steyer29_23-1">b</a></sup></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>29</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=29&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Epple11-24"><span class="mw-cite-backlink"><a href="#cite_ref-Epple11_24-0">↑</a></span> <span class="reference-text">Anton Epple: <cite style="font-style:italic">JavaFX 8: Grundlagen und fortgeschrittene Techniken</cite>. 1. Auflage. dpunkt.verlag, Heidelberg 2015, ISBN 978-3-86490-169-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>11</span> (296 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Anton+Epple&amp;rft.btitle=JavaFX+8%3A+Grundlagen+und+fortgeschrittene+Techniken&amp;rft.date=2015&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783864901690&amp;rft.pages=11&amp;rft.place=Heidelberg&amp;rft.pub=dpunkt.verlag" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer29_65-26"><span class="mw-cite-backlink"><a href="#cite_ref-Steyer29_65_26-0">↑</a></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>29,&nbsp;65</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=29%2C+65&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Epple13-27"><span class="mw-cite-backlink"><a href="#cite_ref-Epple13_27-0">↑</a></span> <span class="reference-text">Anton Epple: <cite style="font-style:italic">JavaFX 8: Grundlagen und fortgeschrittene Techniken</cite>. 1. Auflage. dpunkt.verlag, Heidelberg 2015, ISBN 978-3-86490-169-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>13</span> (296 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Anton+Epple&amp;rft.btitle=JavaFX+8%3A+Grundlagen+und+fortgeschrittene+Techniken&amp;rft.date=2015&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783864901690&amp;rft.pages=13&amp;rft.place=Heidelberg&amp;rft.pub=dpunkt.verlag" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-28"><span class="mw-cite-backlink"><a href="#cite_ref-28">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.oracle.com/javafx/2/api/javafx/scene/Scene.html"><i>Class Scene.</i></a> In: <i>docs.oracle.com.</i><span class="Abrufdatum"> Abgerufen am 11.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Class+Scene&amp;rft.description=Class+Scene&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavafx%2F2%2Fapi%2Fjavafx%2Fscene%2FScene.html&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Ullenboom1033-29"><span class="mw-cite-backlink"><a href="#cite_ref-Ullenboom1033_29-0">↑</a></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java SE 8 Standard-Bibliothek</cite>. 2. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2874-9, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1033</span> (1448 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+SE+8+Standard-Bibliothek&amp;rft.date=2014&amp;rft.edition=2&amp;rft.genre=book&amp;rft.isbn=9783836228749&amp;rft.pages=1033&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-30"><span class="mw-cite-backlink"><a href="#cite_ref-30">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Group.html"><i>Class Group.</i></a> In: <i>docs.oracle.com.</i><span class="Abrufdatum"> Abgerufen am 11.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Class+Group&amp;rft.description=Class+Group&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavase%2F8%2Fjavafx%2Fapi%2Fjavafx%2Fscene%2FGroup.html&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Ullenboom1034f-31"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Ullenboom1034f_31-0">a</a></sup> <sup><a href="#cite_ref-Ullenboom1034f_31-1">b</a></sup></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java SE 8 Standard-Bibliothek</cite>. 2. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2874-9, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1034<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>. (1448 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+SE+8+Standard-Bibliothek&amp;rft.date=2014&amp;rft.edition=2&amp;rft.genre=book&amp;rft.isbn=9783836228749&amp;rft.pages=1034f&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-32"><span class="mw-cite-backlink"><a href="#cite_ref-32">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Control.html"><i>Class Control.</i></a> In: <i>docs.oracle.com.</i><span class="Abrufdatum"> Abgerufen am 11.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Class+Control&amp;rft.description=Class+Control&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavase%2F8%2Fjavafx%2Fapi%2Fjavafx%2Fscene%2Fcontrol%2FControl.html&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Ullenboom1036-33"><span class="mw-cite-backlink"><a href="#cite_ref-Ullenboom1036_33-0">↑</a></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java SE 8 Standard-Bibliothek</cite>. 2. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2874-9, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1036</span> (1448 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+SE+8+Standard-Bibliothek&amp;rft.date=2014&amp;rft.edition=2&amp;rft.genre=book&amp;rft.isbn=9783836228749&amp;rft.pages=1036&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Epple43f-34"><span class="mw-cite-backlink"><a href="#cite_ref-Epple43f_34-0">↑</a></span> <span class="reference-text">Anton Epple: <cite style="font-style:italic">JavaFX 8: Grundlagen und fortgeschrittene Techniken</cite>. 1. Auflage. dpunkt.verlag, Heidelberg 2015, ISBN 978-3-86490-169-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>43<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>. (296 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Anton+Epple&amp;rft.btitle=JavaFX+8%3A+Grundlagen+und+fortgeschrittene+Techniken&amp;rft.date=2015&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783864901690&amp;rft.pages=43f&amp;rft.place=Heidelberg&amp;rft.pub=dpunkt.verlag" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-35"><span class="mw-cite-backlink"><a href="#cite_ref-35">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.oracle.com/javafx/2/ui_controls/overview.htm"><i>JavaFX UI Controls.</i></a> In: <i>docs.oracle.com.</i><span class="Abrufdatum"> Abgerufen am 11.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX+UI+Controls&amp;rft.description=JavaFX+UI+Controls&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavafx%2F2%2Fui_controls%2Foverview.htm&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-36"><span class="mw-cite-backlink"><a href="#cite_ref-36">↑</a></span> <span class="reference-text"><span class="cite">Jeff Friesen: <a rel="nofollow" class="external text" href="https://www.infoworld.com/article/3057072/exploring-javafxs-application-class.html"><i>Exploring JavaFX’s Application class.</i></a> In: <i>infoworld.com.</i> 14.&nbsp;April 2016,<span class="Abrufdatum"> abgerufen am 13.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Exploring+JavaFX%E2%80%99s+Application+class&amp;rft.description=Exploring+JavaFX%E2%80%99s+Application+class&amp;rft.identifier=https%3A%2F%2Fwww.infoworld.com%2Farticle%2F3057072%2Fexploring-javafxs-application-class.html&amp;rft.creator=Jeff+Friesen&amp;rft.date=2016-04-14&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer201-37"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Steyer201_37-0">a</a></sup> <sup><a href="#cite_ref-Steyer201_37-1">b</a></sup> <sup><a href="#cite_ref-Steyer201_37-2">c</a></sup></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>201</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=201&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer202_205-39"><span class="mw-cite-backlink"><a href="#cite_ref-Steyer202_205_39-0">↑</a></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>202–205</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=202-205&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer205_209-40"><span class="mw-cite-backlink"><a href="#cite_ref-Steyer205_209_40-0">↑</a></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>205–209</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=205-209&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Ullenboom1037-41"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Ullenboom1037_41-0">a</a></sup> <sup><a href="#cite_ref-Ullenboom1037_41-1">b</a></sup></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java SE 8 Standard-Bibliothek</cite>. 2. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2874-9, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1037</span> (1448 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+SE+8+Standard-Bibliothek&amp;rft.date=2014&amp;rft.edition=2&amp;rft.genre=book&amp;rft.isbn=9783836228749&amp;rft.pages=1037&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer193ff-42"><span class="mw-cite-backlink"><a href="#cite_ref-Steyer193ff_42-0">↑</a></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>193<span style="display:inline-block;width:.2em">&nbsp;</span>ff</span>., <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=193ff&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Ullenboom379_388-43"><span class="mw-cite-backlink"><a href="#cite_ref-Ullenboom379_388_43-0">↑</a></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java SE 8 Standard-Bibliothek</cite>. 2. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2874-9, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>379–388</span> (1448 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+SE+8+Standard-Bibliothek&amp;rft.date=2014&amp;rft.edition=2&amp;rft.genre=book&amp;rft.isbn=9783836228749&amp;rft.pages=379-388&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Epple22f-44"><span class="mw-cite-backlink"><a href="#cite_ref-Epple22f_44-0">↑</a></span> <span class="reference-text">Anton Epple: <cite style="font-style:italic">JavaFX 8: Grundlagen und fortgeschrittene Techniken</cite>. 1. Auflage. dpunkt.verlag, Heidelberg 2015, ISBN 978-3-86490-169-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>22<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>. (296 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Anton+Epple&amp;rft.btitle=JavaFX+8%3A+Grundlagen+und+fortgeschrittene+Techniken&amp;rft.date=2015&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783864901690&amp;rft.pages=22f&amp;rft.place=Heidelberg&amp;rft.pub=dpunkt.verlag" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer225-45"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Steyer225_45-0">a</a></sup> <sup><a href="#cite_ref-Steyer225_45-1">b</a></sup></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>225</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=225&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Oracle-Binding-46"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Oracle-Binding_46-0">a</a></sup> <sup><a href="#cite_ref-Oracle-Binding_46-1">b</a></sup> <sup><a href="#cite_ref-Oracle-Binding_46-2">c</a></sup> <sup><a href="#cite_ref-Oracle-Binding_46-3">d</a></sup></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm"><i>JavaFX: Properties and Binding Tutorial.</i></a> In: <i>docs.oracle.com.</i><span class="Abrufdatum"> Abgerufen am 13.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=JavaFX%3A+Properties+and+Binding+Tutorial&amp;rft.description=JavaFX%3A+Properties+and+Binding+Tutorial&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavase%2F8%2Fjavafx%2Fproperties-binding-tutorial%2Fbinding.htm&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Ullenboom806f-47"><span class="mw-cite-backlink"><a href="#cite_ref-Ullenboom806f_47-0">↑</a></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java SE 8 Standard-Bibliothek</cite>. 2. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2874-9, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>806<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>. (1448 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+SE+8+Standard-Bibliothek&amp;rft.date=2014&amp;rft.edition=2&amp;rft.genre=book&amp;rft.isbn=9783836228749&amp;rft.pages=806f&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer228_231-48"><span class="mw-cite-backlink"><a href="#cite_ref-Steyer228_231_48-0">↑</a></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>228–231</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=228-231&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer9f-50"><span class="mw-cite-backlink"><a href="#cite_ref-Steyer9f_50-0">↑</a></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>9<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>., <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=9f&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Ullenboom1062f-51"><span class="mw-cite-backlink"><a href="#cite_ref-Ullenboom1062f_51-0">↑</a></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java SE 8 Standard-Bibliothek</cite>. 2. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2874-9, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1062<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>. (1448 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+SE+8+Standard-Bibliothek&amp;rft.date=2014&amp;rft.edition=2&amp;rft.genre=book&amp;rft.isbn=9783836228749&amp;rft.pages=1062f&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Inselbuch1013f-52"><span class="mw-cite-backlink"><a href="#cite_ref-Inselbuch1013f_52-0">↑</a></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java ist auch eine Insel</cite>. 11. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2873-2, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1013<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>. (1306 Seiten, <a rel="nofollow" class="external text" href="https://books.google.de/books?id=LCNWngEACAAJ&amp;pg=PA1013f#v=onepage">eingeschränkte Vorschau</a> in der Google-Buchsuche).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+ist+auch+eine+Insel&amp;rft.date=2014&amp;rft.edition=11&amp;rft.genre=book&amp;rft.isbn=9783836228732&amp;rft.pages=1013f&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Steyer65f-53"><span class="mw-cite-backlink"><a href="#cite_ref-Steyer65f_53-0">↑</a></span> <span class="reference-text">Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>65<span style="display:inline-block;width:.2em">&nbsp;</span>f</span>., <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=65f&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-54"><span class="mw-cite-backlink"><a href="#cite_ref-54">↑</a></span> <span class="reference-text"><span class="cite">Irina Fedortsova: <a rel="nofollow" class="external text" href="https://docs.oracle.com/javafx/2/fxml_get_started/why_use_fxml.htm"><i>Mastering FXML.</i></a> In: <i>docs.oracle.com.</i> Januar 2014,<span class="Abrufdatum"> abgerufen am 14.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Mastering+FXML&amp;rft.description=Mastering+FXML&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavafx%2F2%2Ffxml_get_started%2Fwhy_use_fxml.htm&amp;rft.creator=Irina+Fedortsova&amp;rft.date=2014-01&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-56"><span class="mw-cite-backlink"><a href="#cite_ref-56">↑</a></span> <span class="reference-text"><span class="cite">Simon Vienot: <a rel="nofollow" class="external text" href="https://mail.openjdk.org/pipermail/openjfx-dev/2013-December/011803.html"><i>Scene Builder is now open source!</i></a> In: <i>mail.openjdk.org.</i> 3.&nbsp;Dezember 2013,<span class="Abrufdatum"> abgerufen am 29.&nbsp;März 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Scene+Builder+is+now+open+source%21&amp;rft.description=Scene+Builder+is+now+open+source%21&amp;rft.identifier=https%3A%2F%2Fmail.openjdk.org%2Fpipermail%2Fopenjfx-dev%2F2013-December%2F011803.html&amp;rft.creator=Simon+Vienot&amp;rft.date=2013-12-03&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-57"><span class="mw-cite-backlink"><a href="#cite_ref-57">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="http://gluonhq.com/gluon-supports-scene-builder/"><i>Gluon supports Scene Builder.</i></a> In: <i>gluonhq.com.</i> 4.&nbsp;März 2015,<span class="Abrufdatum"> abgerufen am 29.&nbsp;März 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Gluon+supports+Scene+Builder&amp;rft.description=Gluon+supports+Scene+Builder&amp;rft.identifier=http%3A%2F%2Fgluonhq.com%2Fgluon-supports-scene-builder%2F&amp;rft.date=2015-03-04&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-58"><span class="mw-cite-backlink"><a href="#cite_ref-58">↑</a></span> <span class="reference-text"><span class="cite">Tom Schindl: <a rel="nofollow" class="external text" href="https://wiki.eclipse.org/Efxclipse/Tooling/FXGraph"><i>FXGraph.</i></a> In: <i>eclipse.org.</i> 9.&nbsp;Dezember 2013,<span class="Abrufdatum"> abgerufen am 13.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=FXGraph&amp;rft.description=FXGraph&amp;rft.identifier=https%3A%2F%2Fwiki.eclipse.org%2FEfxclipse%2FTooling%2FFXGraph&amp;rft.creator=Tom+Schindl&amp;rft.date=2013-12-09&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-Inselbuch1014-59"><span class="mw-cite-backlink"><a href="#cite_ref-Inselbuch1014_59-0">↑</a></span> <span class="reference-text">Christian Ullenboom: <cite style="font-style:italic">Java ist auch eine Insel</cite>. 11. Auflage. Galileo Press, 2014, ISBN 978-3-8362-2873-2, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1014</span> (1306 Seiten, <a rel="nofollow" class="external text" href="https://books.google.de/books?id=LCNWngEACAAJ&amp;pg=PA1014#v=onepage">eingeschränkte Vorschau</a> in der Google-Buchsuche).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Christian+Ullenboom&amp;rft.btitle=Java+ist+auch+eine+Insel&amp;rft.date=2014&amp;rft.edition=11&amp;rft.genre=book&amp;rft.isbn=9783836228732&amp;rft.pages=1014&amp;rft.pub=Galileo+Press" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-Almog-60"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Almog_60-0">a</a></sup> <sup><a href="#cite_ref-Almog_60-1">b</a></sup></span> <span class="reference-text"><span class="cite">Shai Almog: <a rel="nofollow" class="external text" href="https://dzone.com/articles/should-oracle-spring-clean-javafx"><i>Should Oracle Spring Clean JavaFX?</i></a> In: <i>dzone.com.</i> 22.&nbsp;November 2015,<span class="Abrufdatum"> abgerufen am 14.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Should+Oracle+Spring+Clean+JavaFX%3F&amp;rft.description=Should+Oracle+Spring+Clean+JavaFX%3F&amp;rft.identifier=https%3A%2F%2Fdzone.com%2Farticles%2Fshould-oracle-spring-clean-javafx&amp;rft.creator=Shai+Almog&amp;rft.date=2015-11-22&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-61"><span class="mw-cite-backlink"><a href="#cite_ref-61">↑</a></span> <span class="reference-text"><span class="cite">Michael Thomas: <a rel="nofollow" class="external text" href="https://jaxenter.de/ruhe-in-frieden-javafx-31013"><i>Ruhe in Frieden, JavaFX?</i></a> In: <i>jaxenter.de.</i> 24.&nbsp;November 2015,<span class="Abrufdatum"> abgerufen am 14.&nbsp;Dezember 2016</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Ruhe+in+Frieden%2C+JavaFX%3F&amp;rft.description=Ruhe+in+Frieden%2C+JavaFX%3F&amp;rft.identifier=https%3A%2F%2Fjaxenter.de%2Fruhe-in-frieden-javafx-31013&amp;rft.creator=Michael+Thomas&amp;rft.date=2015-11-24&amp;rft.language=de">&nbsp;</span></span>
</li>
<li id="cite_note-62"><span class="mw-cite-backlink"><a href="#cite_ref-62">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20160923203327/http://www.ijug.eu/home-ijug/aktuelle-news/article/ijug-fordert-von-oracle-ein-klares-bekenntnis-zu-javafx.html"><i>iJUG fordert von Oracle ein klares Bekenntnis zu JavaFX.</i></a> In: <i>ijug.eu.</i> 27.&nbsp;Januar 2016, archiviert vom <span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fwww.ijug.eu%2Fhome-ijug%2Faktuelle-news%2Farticle%2Fijug-fordert-von-oracle-ein-klares-bekenntnis-zu-javafx.html">Original</a></span> (nicht mehr online verfügbar) am <span style="white-space:nowrap;">23.&nbsp;September 2016</span><span>;</span><span class="Abrufdatum"> abgerufen am 14.&nbsp;Dezember 2016</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=iJUG+fordert+von+Oracle+ein+klares+Bekenntnis+zu+JavaFX&amp;rft.description=iJUG+fordert+von+Oracle+ein+klares+Bekenntnis+zu+JavaFX&amp;rft.identifier=https%3A%2F%2Fweb.archive.org%2Fweb%2F20160923203327%2Fhttp%3A%2F%2Fwww.ijug.eu%2Fhome-ijug%2Faktuelle-news%2Farticle%2Fijug-fordert-von-oracle-ein-klares-bekenntnis-zu-javafx.html&amp;rft.date=2016-01-27&amp;rft.source=http://www.ijug.eu/home-ijug/aktuelle-news/article/ijug-fordert-von-oracle-ein-klares-bekenntnis-zu-javafx.html&amp;rft.language=de">&nbsp;</span></span>
</li>
<li id="cite_note-Schlosser-63"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Schlosser_63-0">a</a></sup> <sup><a href="#cite_ref-Schlosser_63-1">b</a></sup></span> <span class="reference-text"><span class="cite">Hartmut Schlosser: <a rel="nofollow" class="external text" href="https://jaxenter.de/hart-aber-fair-welche-zukunft-hat-javafx-37199"><i>Hart aber Fair: Welche Zukunft hat JavaFX?</i></a> In: <i>jaxenter.de.</i> 22.&nbsp;März 2016,<span class="Abrufdatum"> abgerufen am 14.&nbsp;Dezember 2016</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Hart+aber+Fair%3A+Welche+Zukunft+hat+JavaFX%3F&amp;rft.description=Hart+aber+Fair%3A+Welche+Zukunft+hat+JavaFX%3F&amp;rft.identifier=https%3A%2F%2Fjaxenter.de%2Fhart-aber-fair-welche-zukunft-hat-javafx-37199&amp;rft.creator=Hartmut+Schlosser&amp;rft.date=2016-03-22&amp;rft.language=de">&nbsp;</span></span>
</li>
<li id="cite_note-64"><span class="mw-cite-backlink"><a href="#cite_ref-64">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://jaxenter.de/javafx-hybride-desktopanwendungen-18453"><i>Interview mit Alexander Casall: „Nur Chuck Norris kann hybride Desktopanwendungen“.</i></a> In: <i>jaxenter.de.</i> 21.&nbsp;April 2015,<span class="Abrufdatum"> abgerufen am 14.&nbsp;Dezember 2016</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Interview+mit+Alexander+Casall%3A+%E2%80%9ENur+Chuck+Norris+kann+hybride+Desktopanwendungen%E2%80%9C&amp;rft.description=Interview+mit+Alexander+Casall%3A+%E2%80%9ENur+Chuck+Norris+kann+hybride+Desktopanwendungen%E2%80%9C&amp;rft.identifier=https%3A%2F%2Fjaxenter.de%2Fjavafx-hybride-desktopanwendungen-18453&amp;rft.date=2015-04-21&amp;rft.language=de">&nbsp;</span></span>
</li>
</ol>
<div class="mw-heading mw-heading2"><h2 id="Anmerkungen">Anmerkungen</h2></div>
<ol class="references" data-mw-group="Anmerkung">
<li id="cite_note-15"><span class="mw-cite-backlink"><a href="#cite_ref-15">↑</a></span> <span class="reference-text">Nicht zu verwechseln mit der Geheimdienstsoftware <a href="PRISM" title="PRISM">PRISM</a></span>
</li>
<li id="cite_note-18"><span class="mw-cite-backlink"><a href="#cite_ref-18">↑</a></span> <span class="reference-text">Die main()-Methode ist bei einer JavaFX-Applikation im Grunde nicht notwendig, während sie bei einer normalen Java-Applikation ja den zentralen Einstiegspunkt darstellt. Sie wird von NetBeans nur zur Sicherheit generiert, um im Fall mangelnder JavaFX-Unterstützung auf Zielplattformen den Start der Applikation zu gewährleisten. Netbeans selbst ignoriert die main()-Methode. Siehe: Ralph Steyer: <cite style="font-style:italic">Einführung in JavaFX</cite>. 1. Auflage. Springer Vieweg, Wiesbaden 2014, ISBN 978-3-658-02835-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>29</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-658-02836-7">10.1007/978-3-658-02836-7</a></span> (361 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Ralph+Steyer&amp;rft.btitle=Einf%C3%BChrung+in+JavaFX&amp;rft.date=2014&amp;rft.doi=10.1007%2F978-3-658-02836-7&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783658028350&amp;rft.pages=29&amp;rft.place=Wiesbaden&amp;rft.pub=Springer+Vieweg" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-22"><span class="mw-cite-backlink"><a href="#cite_ref-22">↑</a></span> <span class="reference-text">Der Grund dafür ist, dass die init-Methode – genau wie der Konstruktor der Klasse – noch vom Launcher-Thread der Anwendung aufgerufen wird. UI-Elemente dürfen aber nur im JavaFX-Application-Thread erzeugt und modifiziert werden. Siehe: Anton Epple: <cite style="font-style:italic">JavaFX 8: Grundlagen und fortgeschrittene Techniken</cite>. 1. Auflage. dpunkt.verlag, Heidelberg 2015, ISBN 978-3-86490-169-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>10</span> (296 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Anton+Epple&amp;rft.btitle=JavaFX+8%3A+Grundlagen+und+fortgeschrittene+Techniken&amp;rft.date=2015&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783864901690&amp;rft.pages=10&amp;rft.place=Heidelberg&amp;rft.pub=dpunkt.verlag" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-25"><span class="mw-cite-backlink"><a href="#cite_ref-25">↑</a></span> <span class="reference-text">Für eine ausführliche Beschreibung der Klasse Stage siehe: <span class="cite"><a rel="nofollow" class="external text" href="https://docs.oracle.com/javafx/2/api/javafx/stage/Stage.html"><i>Class Stage.</i></a> In: <i>docs.oracle.com.</i><span class="Abrufdatum"> Abgerufen am 11.&nbsp;Dezember 2016</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AJavaFX&amp;rft.title=Class+Stage&amp;rft.description=Class+Stage&amp;rft.identifier=https%3A%2F%2Fdocs.oracle.com%2Fjavafx%2F2%2Fapi%2Fjavafx%2Fstage%2FStage.html&amp;rft.language=en">&nbsp;</span> Siehe auch: Anton Epple: <cite style="font-style:italic">JavaFX 8: Grundlagen und fortgeschrittene Techniken</cite>. 1. Auflage. dpunkt.verlag, Heidelberg 2015, ISBN 978-3-86490-169-0, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>11<span style="display:inline-block;width:.2em">&nbsp;</span>ff</span>. (296 Seiten).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:JavaFX&amp;rft.au=Anton+Epple&amp;rft.btitle=JavaFX+8%3A+Grundlagen+und+fortgeschrittene+Techniken&amp;rft.date=2015&amp;rft.edition=1&amp;rft.genre=book&amp;rft.isbn=9783864901690&amp;rft.pages=11ff&amp;rft.place=Heidelberg&amp;rft.pub=dpunkt.verlag" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-38"><span class="mw-cite-backlink"><a href="#cite_ref-38">↑</a></span> <span class="reference-text">Im Unterschied dazu sind konsolenbasierte oder ältere grafische Programme oft eine lineare bzw. deterministische Folge von Anweisungen und/oder Eingaben, die nacheinander abgearbeitet werden.</span>
</li>
<li id="cite_note-49"><span class="mw-cite-backlink"><a href="#cite_ref-49">↑</a></span> <span class="reference-text">Dies ist vergleichbar mit <a href="XAML" class="mw-redirect" title="XAML">XAML</a> (Extensible Application Markup Language) aus dem .NET-Framework von Microsoft.</span>
</li>
<li id="cite_note-55"><span class="mw-cite-backlink"><a href="#cite_ref-55">↑</a></span> <span class="reference-text">Das Tool ist unter folgender URL für Windows, OS X und Linux erhältlich: <a rel="nofollow" class="external free" href="https://gluonhq.com/products/scene-builder/">https://gluonhq.com/products/scene-builder/</a></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-01-26" href="https://de.wikipedia.org/wiki/?title=JavaFX&amp;oldid=252714781">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>